C++ 运算符优先级:GCC 5.2 与 Visual Studio 2015

C++ Operator Precedence: GCC 5.2 vs Visual Studio 2015

让我们使用简单的 C++ 代码,例如:

int main(){
    int a = 0;
    while(a<3) {
        a=a++;
        std::cout<<a<<std::endl;
    }  
}

此代码使用 Visual Studio 2015 打印 1、2、3,当 g++ 5.2.0 进入无限循环并仅打印零时。

根据 C++ Operator Precedence 赋值运算符 (=) 的优先级低于 post 递增。这表明第一个零是对变量 'a' 的赋值,之后 'a' 递增,因此在第一次迭代后 a = 1。因此从 VS 2015 获得的结果是正确的。为什么 GCC 产生不同的输出?

您的程序无效(未定义行为)因此编译器可以生成任何内容。

问题是您在一条语句中多次分配给单个变量(与序列点有关)。

a=a++;

因此应该是:

 a++;