在“for”循环中,后增和前增产生相同的输出结果

245
以下这两个 for 循环产生相同的结果,尽管一个使用后增量运算符(post increment),另一个则使用前增量运算符(pre-increment)。
以下是代码:
for(i=0; i<5; i++) {
    printf("%d", i);
}

for(i=0; i<5; ++i) {
    printf("%d", i);
}

我使用两个“for”循环得到相同的输出,我错过了什么吗?


我查看了几个链接,但没有找到我要找的答案。简短的答案是“序列点”。引用C11草案附录C序列点的部分内容:“- 在完整表达式的评估和下一个要评估的完整表达式之间。以下是完整表达式:……for语句的每个(可选)表达式(6.8.5.3);返回语句中的(可选)表达式(6.8.6.4)。这意味着在for循环的每个表达式后都有序列点。因此,在for循环的第三个表达式中执行++i或i++或i+=1或i=i+1并不重要。 - ZeZNiQ
12个回答

0

如果这样做,会有所不同:

int main()
{
  for(int i(0); i<2; printf("i = post increment in loop %d\n", i++))
  {
    cout << "inside post incement = " << i << endl;
  }


  for(int i(0); i<2; printf("i = pre increment in loop %d\n",++i))
  {
    cout << "inside pre incement = " << i << endl;
  }

  return 0;
}

结果:

循环内后置递增 = 0

i = 循环内后置递增 0

循环内后置递增 = 1

i = 循环内后置递增 1

第二个 for 循环:

循环内前置递增 = 0

i = 循环内前置递增 1

循环内前置递增 = 1

i = 循环内前置递增 2


2
这个差异与for循环无关;而是因为你在语句中使用了具有副作用的前/后增量。 - Foo Bah

-2

编译器翻译

for (a; b; c)
{
    ...
}

a;
while(b)
{
    ...
 end:
    c;
}

所以在你的情况下(后/前增量),这并不重要。

编辑:继续语句只需替换为goto end;


实际上,那并不完全正确。以for(int i = 0; i < 42; i++) { printf("%d", i); continue; }为例。你的说法是它在语义上等同于int i = 0; while(i < 42) { printf("%d", i); continue; i++; },这显然是错误的。 - jason
请看我的编辑。这个陈述不是我说的,而是我读过的一本关于编译器的书上说的,如果我没记错的话,应该是这本书http://www.amazon.com/Compilers-Principles-Techniques-Alfred-Aho/dp/0201100886。 - jdehaan
1
我怀疑《龙书》里不会有这样的错误。无论如何,也许需要更仔细地阅读一下? - jason

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接