【问题标题】:What happens if a conditional isn't supplied to a For Loop?如果条件没有提供给 For 循环会发生什么?
【发布时间】:2020-12-04 00:03:30
【问题描述】:

考虑一下这个sn-p:

int numbers[9] = {5, 2, 78, 23, 8, 9, 3, 12, 97};
int arrLength = (sizeof(numbers) / sizeof(int));

for(int i = 0; arrLength; i++) {
    printf("%d\n", numbers[i]);
}

我给了一个数组长度作为循环的第二个参数,但没有给它何时停止的条件。 out 给出了我数组中的 9 个数字,然后继续。这是程序输出的示例。程序以这种方式轻松输出超过 100 位数字。谁能解释一下是什么在起作用?

【问题讨论】:

  • 您提供了一个条件;您刚刚使用了arrLength != 0 的简写。省略条件看起来像:for (int i = 0; ; i++)。那是一个无限循环;缺少的条件被视为始终为真。

标签: c loops for-loop int


【解决方案1】:

在这种情况下,条件提供的。

 for(int i = 0; arrLength; i++)

相同
for(int i = 0; arrLength != 0; i++)

换句话说,控制表达式(也称为条件检查)应评估为 TRUE 以继续执行循环体。

来自C11,第 6.8.5 章,P4

一个迭代语句会导致一个称为循环体的语句被重复执行,直到控制表达式比较等于 0。[...]

还有,脚注 158,for 循环

[...]控制表达式 expression-2 指定在每次迭代之前进行的评估,这样循环的执行将继续,直到表达式比较等于 0; [...]

如果条件提供,则将其视为非零(始终为真值)。

第 6.8.5.3 章,第 2 段

clause-1 和 expression-3 都可以省略。省略的表达式 2 被非零常量替换。

【讨论】:

  • 看来我创建了一个无限循环。但是程序最终会终止。这是由于机器上的内存耗尽了吗?我的任务管理器没有显示任何内存峰值。
  • @KeplerIO 还有更多,计数器的不受控制的增量会导致溢出,并且鉴于计数器是有符号整数类型,它会导致未定义的行为。
猜你喜欢
  • 1970-01-01
  • 2018-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-27
  • 2015-01-03
  • 2012-03-16
  • 2012-10-20
相关资源
最近更新 更多