给定
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]
这两个版本总是相同的吗?如果不是,它们什么时候不相等?
给定
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]
这两个版本总是相同的吗?如果不是,它们什么时候不相等?
这一行:
y[i] = x[i++];
是未定义的行为。您不能在同一语句中使用i
and 。i++
您的版本 2,带有i++
内部for
控制语句,很好。
如果我们围绕Greg Hewgill在他的回答中正确诊断的未定义行为进行编码,那么我们最终可能会得到如下代码:
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;
where cont
is the label that was commented out,紧挨着右大括号之前。请注意,它会跳过 的增量i
,这就是循环“无限”的原因。
因此,如果没有continue
内部,这两个循环是等价的。
请注意,相关循环:
for (int i = 0; i < n; i++)
{
if (i % 3 == 0)
continue;
y[i] = x[i];
}
for
与第一个循环并不完全相同。该变量在循环和第一个循环i
的循环之外(之后)可用;当变量在循环本身中声明时,它不可用。while
for
for
好问题,看看这里 你可以找到一个不错的 c 到汇编 Web 编译器 我比较了两个版本,循环实现中存在微小的汇编差异。功能似乎完全相同,因此我得出结论,两个样本总是相同的。而案例: 对于案例: