1

给定

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]

这两个版本总是相同的吗?如果不是,它们什么时候不相等?

4

3 回答 3

7

这一行:

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

未定义的行为。您不能在同一语句中使用iand 。i++

您的版本 2,带有i++内部for控制语句,很好。

于 2013-09-02T21:30:46.897 回答
4

如果我们围绕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的行为。whilefor

循环运行良好,for没有初始化元素y[0]、或y[3],但在其他方面工作得很好。y[6]y[9]

while循环看起来很相似,但该语句continue;等效于goto cont;where contis 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的循环之外(之后)可用;当变量在循环本身中声明时,它不可用。whileforfor

于 2013-09-02T21:48:37.287 回答
0

好问题,看看这里 你可以找到一个不错的 c 到汇编 Web 编译器 我比较了两个版本,循环实现中存在微小的汇编差异。功能似乎完全相同,因此我得出结论,两个样本总是相同的。而案例: 这是while循环 对于案例: 这是for循环

于 2013-09-02T21:41:22.747 回答