gpt4 book ai didi

c - 循环中的冗余代码

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:29:27 24 4
gpt4 key购买 nike

我有一个列表:

id num1 ...
-----------
1 123 ...
1 456 ...
2 789 ...
2 666 ...

并想基于它创建一个对象数组:

{ 1, [123, 456], [...] },
{ 2, [789, 666], [...] }

这是我的伪代码:

int previous_id = -1;
array a1 = null; // B
array a2 = null; // B
array a3 = null; // B
array a4 = null; // B
while (++c) { // c is a pointer pointing to the list
if (c.id != previous_id && previous_id != -1) {
j[i++].id = previous_id; // A
j[i++].data1 = a1; // A
j[i++].data2 = a2; // A
j[i++].data3 = a3; // A
j[i++].data4 = a4; // A
a1 = null; // B
a2 = null; // B
a3 = null; // B
a4 = null; // B
}
a1.add(c.num1);
a2.add(c.num2);
a3.add(c.num3);
a4.add(c.num4);
previous_id = c.id;
}
j[i++].id = previous_id; // A
j[i++].data1 = a1; // A
j[i++].data2 = a2; // A
j[i++].data3 = a3; // A
j[i++].data4 = a4; // A

它可以工作,但有一些冗余代码,即 A 和 B

是否可以将它们合并起来,使其更加简洁明了?

最佳答案

如果这是目标,您可以采取一些措施来提高代码的清晰度。

与其使用不同的名称,不如使用索引。

“array”没有定义,所以我猜它是一个表。你可以有类似的东西:

  #define NB_ARRAYS 4
array myArrays[NB_ARRAYS];

这样,您就可以遍历数组,并最终在将来随时更改数组的数量。

好的想法是您不再需要单独列出数组,一个循环就足够了。因此:

    a1 = null;   // B
a2 = null; // B
a3 = null; // B
a4 = null; // B

成为

    { int i; for (i=0; i<NB_ARRAYS; i++) myArrays[i] = NULL; }

您可能会提示这并不比第一个版本好,但实际上您可以将这种复杂性隐藏在宏后面:

    #define INIT_ARRAYS(a) { int i; for (i=0; i<NB_ARRAYS; i++) a[i] = NULL; }

或者更好,在内联函数后面:

    static inline void initArrays(array* a) { int i; for (i=0; i<NB_ARRAYS; i++) a[i] = NULL; }

所以它变成了:

    initArrays(myArrays);

哪个更清楚。

重用相同的原则,它会导致你的代码变成这样:

    int previous_id = -1;
initArrays(myArrays);

while (++c)
{ // c is a pointer pointing to the list
addToArrays(myArrays, c);
if (c.id != previous_id && previous_id != -1 || c.islast() )
{
j[i++].id = previous_id; // A
setArrays(j, i, myArrays); i+=NB_ARRAYS;
if (!c.islast()) { initArrays(myArrays); }
}
}
previous_id = c.id;

应该更容易阅读,因此更容易维护。

另外:尝试使用更容易阅读的变量。在这个例子中,我不知道 c、i 或 j 代表什么(也不知道它们在哪里定义)。使用 5-6 个字符来正确命名它们的成本并不高,并且确实有助于代码维护。

关于c - 循环中的冗余代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19488056/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com