【问题标题】:Possibly GCC bug on for with two variables compilation两个变量编译时可能存在 GCC 错误
【发布时间】:2015-11-26 11:51:24
【问题描述】:

在此代码编译过程中,我遇到了一些奇怪的 GCC 行为:

for(int i = 9, j = 0; i >= 0; --i, j++) {
    cout << i << " " << j << endl;
}

显然,这里的 i 是前增量的,而 j 是后增量的,在第一次迭代中 i 应该是 8,并且 j 应该是 0,但似乎 GCC 将 ij 都视为 post-(dec/inc)remental。

所以我得到了输出

9 0
8 1
...

GCC 1.9.3 PAE,使用 -O0 编译

【问题讨论】:

  • for 语句 [for(initialise,condition,this_bit_after)] 的最后一部分在循环块的内容之后执行,所以是的,它们都是关于循环体的后增量.
  • “GCC 错误”是一件大事,尤其是对于这段常见的代码。三重检查问题和之前的代码。 99.999% 的问题不是编译器错误。

标签: c++ debugging gcc


【解决方案1】:

这是按预期工作的。

迭代表达式在循环体的末尾执行。代码的 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++ 中的工作方式。

【讨论】:

  • 感谢您的详细回答,由于某种原因,这对我来说并不明显 O_O
【解决方案2】:

除非你真的知道发生了什么,否则不要责怪编译器。

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

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

【讨论】:

    猜你喜欢
    • 2016-08-09
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-14
    相关资源
    最近更新 更多