【问题标题】:C - is it possible to decrement the max value of a for loop from within the for loop?C - 是否可以从 for 循环中减少 for 循环的最大值?
【发布时间】:2010-04-12 21:27:03
【问题描述】:

例如:

void decrement(int counter) {
    counter--;
}

int counter = 20;
for (int i = 0; i < counter; i++) {
    for (int j = 0; j < counter, j++) {
        decrement(counter);
    }
}

理想情况下,我希望看到 counter var 在每次运行 for 循环时都会递减,因此它运行的迭代次数少于 20 次。但是gdb显示decrement()counter是递减的,但是回到for循环counter实际上保持不变。

【问题讨论】:

  • 是的,但如果你要这样做,它作为while 循环会更具可读性。

标签: c for-loop


【解决方案1】:

是的,有可能:

for (int i = 0; i < counter; i++) {
    counter--;
}

它在您的示例中不起作用的原因是因为您通过值传递并修改了值的副本。如果你传递一个指向变量的指针而不是仅仅传递值,它会起作用。

【讨论】:

  • 它有助于思考它是如何编译的:在每次迭代之前读取和检查计数器,因此循环内的修改只会改变检查。说服自己的一种方法是将其转换为 while 循环。
【解决方案2】:

您也可以use pointers,以便在decrement 函数之外保持更改值:

void decrement(int *counter) {
    (*counter)--;
}

int counter = 20;
for (int i = 0; i < counter; i++) {
    for (int j = 0; j < counter; j++) {
        decrement(&counter);
    }
}

或者只是执行counter-- 而不是调用decrement 函数。

【讨论】:

    【解决方案3】:

    正如马克所表明的那样,这是可能的,但它是其中之一不要这样做

    虽然你可以使用 for 循环来处理各种棘手的事情,但如果你能以更清晰的方式编写它,最好不要这样做。

    保持代码简短以便于理解,而不是代码空间。代码是供人类阅读的,而不是关心它占用了多少空间。 (反正一般情况下)

    【讨论】:

    • +1!在几乎任何语言中,这都是一种不好的做法。正如其他人所说,如果绝对需要这种逻辑,请使用 while()。
    【解决方案4】:

    您所做的只是counter --;,您不需要做任何特别的事情,特别是如果它增加了代码的复杂性,而没有提供该语言已经无法提供的任何额外功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-04
      • 2011-12-22
      • 2011-10-29
      • 1970-01-01
      • 2011-05-16
      相关资源
      最近更新 更多