可能是GCC错误,有两个变量编译

时间:2015-11-26 11:51:24

标签: c++ debugging gcc

我在这段代码编译中遇到了一些奇怪的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编译

2 个答案:

答案 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++;
}

前缀/后缀仅作为某些“普通”较长语句的一部分很重要,但不是循环。