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++;
让我们使用简单的 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++;