【问题标题】:C - Abbreviated for loop executed only onceC - 仅执行一次的缩写 for 循环
【发布时间】:2010-02-15 23:35:35
【问题描述】:

我在 Mac 上有一个用 ANSI C 编写的命令行实用程序,它具有为单链表创建冒泡排序数组的功能。我声明了循环变量。

int a = 0;   
int b = 0;

我以缩写样式为循环编写了冒泡排序(即,将变量初始化留空)。

for ( ; a < size; a++)  
  for( ; b < size; b++) 

这在退出前只执行了一次。先前使用 i 变量填充数组的 for 循环以相同的方式编写并按预期执行。冒泡排序循环的修复方法是将 a = 0 和 b = 0 放回原处。缩写的 for 循环无法执行是否有原因?

【问题讨论】:

  • 你真的需要循环体之外的 a 和 b 吗?如果没有,它们应该在其中声明。在循环外声明它们意味着它们是在循环外使用的,这意味着在循环执行时它们可能不会像您预期的那样为零。
  • 这是 ANSI C。如果变量在内部声明(即,在 C99 模式外使用的“for”循环初始声明),编译器会抛出警告。
  • 为了将来参考,如果您一次跟踪代码的执行,这种初学者的错误会立即变得清晰。您可以在调试器中或手动执行此操作。它确实会帮助您更快、更深入地学习。

标签: c for-loop


【解决方案1】:

如果你忽略b=0,内部循环将只运行一次,因为在那之后 b 已经等于大小。您需要在内循环的每次迭代中将 b 重置为 0。

【讨论】:

  • 这就是答案。我用我的代码对此进行了测试。当外循环重新启动时,内循环没有被重置为零。谢谢!
【解决方案2】:

为什么要使用你所谓的for循环的缩写样式?

for 循环只是下面 while 循环的语法糖:

for (INIT ; ENDTEST ; STEP){
    DO_SOME_STUFF
}

意思

INIT
while (ENDTEST) {
 DO_SOME_STUFF
 STEP
}

因此你的两个循环正在做:

int a = 0;
int b = 0;
while (a < size){
   while (b < size){
      DO_SOME_STUFF
      b++;
   }
   a++;
}

在这种形式中,您可以很容易地看到 b 的初始化没有在应有的地方完成。

我只能说避免使用缩写 for 循环,删除初始化并不比删除结束测试或删除循环步骤(两者在 C 中也是合法的)都是在程序中添加错误的简单方法。 不要这样做。

【讨论】:

  • for 循环并不完全等同于 while 循环。循环体中的continue 语句在每种情况下执行不同的操作。
  • 你说得对,for循环中的continue语句执行步骤,而不是上面的while。
【解决方案3】:

用于填充数组的不同 for 循环以相同的方式编写并按预期执行。

听起来这是在当前循环之前,并且使用了相同的变量ab

之后并没有将它们重置为零。

【讨论】:

  • 我编辑了文本。前面的 for 循环使用了 i 变量。
猜你喜欢
  • 2022-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-22
  • 1970-01-01
  • 2013-05-29
  • 2019-11-24
相关资源
最近更新 更多