这是一个初学者问题。
以下是我正在使用的C ++代码
int main() {
int x=5, y=5;
cout<<x--;
cout<<",";
cout<<--x;
cout<<",";
cout<<y--<<","<<--y;
return 0;
}
在Turbo C ++ 3.0中运行时,以下是代码显示的输出:
5,3,4,4
在Windows上使用Code :: Blocks编译时(使用MinGW和GCC / G ++),显示的输出如下:
5,3,4,3
以前,我听说有时不同的编译器对某些问题的行为有所不同,但我不明白为什么会显示这个结果。从逻辑上讲,我认为输出应该是:
5,3,5,3
请您在逻辑上告诉我输出的原因。
谢谢!
答案 0 :(得分:3)
输出没有对错。您的代码具有未定义的行为,一切皆有可能。
原因在于C ++标准的第1.9.15(n3337)段(强调我的):
除非另有说明,否则评估各个运算符的操作数和个体的子表达式 表达式未被排序。 [注意:在执行期间多次计算的表达式中 一个程序,对其子表达式的无序和不确定顺序的评估不一定是 在不同的评估中表现一致。 -end note]一个操作数的值计算 在运算符结果的值计算之前对运算符进行排序。 如果对标量有副作用 对于相同标量对象的另一个副作用或值计算,对象未被排序 使用相同标量对象的值,行为未定义。
在这一行
cout << y-- << "," << --y;
您在标量对象(y--
)上引入了两个副作用(分别通过后缀和前缀递增)和两个值计算(--y
和y
的结果)他们没有统治。因此,你的程序是不正确的,几乎任何东西都是可能的输出。
详细了解此here。
答案 1 :(得分:0)
cout<<y--<<","<<--y;
是一个表达式,在y
上有两个无序的副作用,因此具有未定义的行为。