C++ 如何在表达式中计算后缀和前缀增量运算符?

C++ 如何在表达式中计算后缀和前缀增量运算符?,c++,post-increment,pre-increment,C++,Post Increment,Pre Increment,当我在VisualStudio上运行这个程序时,输出是7 8 5 我认为它依赖于编译器。如果我错了,请纠正我 但是不是应该是7.75还是5.77 执行各种n++/+++n的顺序未被C标准定义,可能会随着时间的推移或根据目标机器和/或优化选项而改变。然而,我认为,编译器仍然应该创建代码,以原子方式执行n++或++n中的每一个。因此,如果VisualStudio显然从N+开始,从结果中的5可以看到,那么它应该创建7×7 5或6 8 5作为结果,这取决于它是否执行前面的n++或中间的++N作为第二项。

当我在VisualStudio上运行这个程序时,输出是7 8 5

我认为它依赖于编译器。如果我错了,请纠正我
但是不是应该是7.75还是5.77

执行各种n++/+++n的顺序未被C标准定义,可能会随着时间的推移或根据目标机器和/或优化选项而改变。然而,我认为,编译器仍然应该创建代码,以原子方式执行n++或++n中的每一个。因此,如果VisualStudio显然从N+开始,从结果中的5可以看到,那么它应该创建7×7 5或6 8 5作为结果,这取决于它是否执行前面的n++或中间的++N作为第二项。 但是G++也会产生785。当我看汇编代码时,原因似乎是,G++严格按照从右到左的顺序执行所有增量,但也在后面用n来别名++n。从以下代码中可以更清楚地看到这一点:

#include "stdafx.h"
#include <iostream>
#include <conio.h>

using namespace std;

int main()
{
 int n = 5;

 cout<< n++ <<" "<< ++n << " "<< n++;

 _getch();
 return 0;
}
结果是6742。显然,对于n++,编译器在增量之前创建n的快照,而对于+++n,编译器只执行增量,然后在写入cout时使用当前值n


当然,将两个增量设置为相同值的结果是未定义的,因此编译器的选择是完全合法的。

此外,未定义的不仅仅是它们的执行顺序。这是整个程序的行为。所以,是的,根据语言定义,以不同的顺序进行不同的增量是可以的,就像重新格式化硬盘一样。
int n = 2;
cout << n++ << " " << ++n << " " << n++ << " " << ++n << " " << n++;