鉴于
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]
两个版本总是相同吗?如果没有,他们什么时候不相同?
答案 0 :(得分:7)
这一行:
y[i] = x[i++];
是未定义的行为。您不能在同一声明中使用i
和i++
。
你的版本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
循环不完全相同。变量i
在while
循环和第一个for
循环的循环之外(之后)可用;当变量在for
循环中声明时,它不可用。
答案 2 :(得分:0)
好问题,
看看here
你可以找到一个很好的c汇编程序web编译器
我比较了两个版本,并且循环实现中存在较小的程序集差异。
功能似乎完全相同我得出结论两个样本总是等价的。
案件:
对于案例: