基本C循环比较

时间:2013-09-02 21:29:33

标签: c arrays for-loop while-loop

鉴于

int x[10];
int y[10];
int n = 10;

版本1

int i = 0;
while (i < n)
  y[i] = x[i++];

第2版

for (int i = 0; i < n; i++)
  y[i] = x[i]

两个版本总是相同吗?如果没有,他们什么时候不相同?

3 个答案:

答案 0 :(得分:7)

这一行:

y[i] = x[i++];

未定义的行为。您不能在同一声明中使用ii++

你的版本2,i++控件声明中的for没问题。

答案 1 :(得分:4)

如果我们围绕Greg Hewgill answer中{{3}}正确诊断的未定义行为进行编码,那么我们可能会得到这样的代码:

int x[10] = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 };
int y[10];
int n = 10;

i = 0;
while (i < n)
{
    if (i % 3 == 0)
        continue;
    y[i] = x[i];
    i++;
//cont: ;
}

for (i = 0; i < n; i++)
{
    if (i % 3 == 0)
        continue;
    y[i] = x[i];
}

由于continue语句,这些循环不等效 - 实际上,第一个循环是无限循环。并且可以在没有continue的情况下编写循环体,但我想要一些简单的东西来说明continue循环和while循环中for的行为。

for循环表现得很明智,而不是初始化元素y[0]y[3]y[6]y[9],但其他方式效果非常好。

while循环看起来很相似,但continue;语句相当于goto cont;,其中cont是在结束括号之前注释掉的标签。请注意,它会跳过i的增量,这就是循环为“无限”的原因。

因此,如果内部没有continue,则两个循环是等效的。

请注意相关循环:

for (int i = 0; i < n; i++)
{
    if (i % 3 == 0)
        continue;
    y[i] = x[i];
}

与第一个for循环不完全相同。变量iwhile循环和第一个for循环的循环之外(之后)可用;当变量在for循环中声明时,它不可用。

答案 2 :(得分:0)

好问题, 看看here 你可以找到一个很好的c汇编程序web编译器 我比较了两个版本,并且循环实现中存在较小的程序集差异。 功能似乎完全相同我得出结论两个样本总是等价的。 案件: this is the while loop 对于案例: this is the for loop