我在这段代码编译中遇到了一些奇怪的GCC行为:
for(int i = 9, j = 0; i >= 0; --i, j++) {
cout << i << " " << j << endl;
}
显然, i 这里是增量前的, j 是后增量的,在第一次迭代中 i 应该是8,并且< strong> j 应为0,但似乎GCC将 i 和 j 视为post-(dec / inc)remental。
所以我得到输出
9 0
8 1
...
GCC 1.9.3 PAE,用-O0编译
答案 0 :(得分:3)
这是按预期工作的。
迭代表达式在循环体的末尾执行。您的代码的等效while
循环将是这样的:
{
int i = 9, j = 0;
while (i >= 0) {
cout << i << " " << j << endl;
--i, j++;
}
}
请注意,在这种情况下,前后增量在功能上是等效的。
您假设扩展是这样的:
{
int i = 9, j = 0;
while (i >= 0) {
--i;
cout << i << " " << j << endl;
j++;
}
}
但这不是for
循环在C ++中的工作方式。
答案 1 :(得分:1)
除非你真的知道发生了什么,否则不要责怪编译器。
for(int i = 9, j = 0; i >= 0; --i, j++) {
cout << i << " " << j << endl;
}
与
相同for(int i = 9, j = 0; i >= 0; ) {
cout << i << " " << j << endl;
--i;j++;
}
而不是
for(int i = 9, j = 0; i >= 0;) {
--i;
cout << i << " " << j << endl;
j++;
}
前缀/后缀仅作为某些“普通”较长语句的一部分很重要,但不是循环。