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

时间:2013-08-11 17:09:47

标签: c++ post-increment pre-increment

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

using namespace std;

int main()
{
 int n = 5;

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

 _getch();
 return 0;
}

当我在Visual Studio上运行此程序时,输出为7 8 5。

我认为它依赖于编译器。 (如果我错了,请纠正我) 但不应该是7 7 5还是5 7 7?

1 个答案:

答案 0 :(得分:1)

执行各种n ++ / ++ n的序列未被C标准定义,并且可能随时间或根据目标机器和/或优化选项而变化。但是,我认为,编译器应该仍然创建代码,以原子方式执行每个n ++或++ n。因此,如果Visual Studio显然最后以n ++开头(从结果中的“5”可以看出),那么它应该创建7 7 5或6 8 5,这取决于它是否执行n ++在前面或者在中间的++ n作为第二个词。

但是G ++也产生了7 8 5.当我看到汇编代码时,原因似乎是,G ++从右到左严格按顺序执行所有增量,但也将“++ n”别名为“n” “后来。从这段代码中可以更清楚地看到这一点:

int n = 2;
cout << n++ << " " << ++n << " " << n++ << " " << ++n << " " << n++;

结果是6 7 4 7 2。显然,在n++的情况下,编译器在增量之前创建n的“快照”,而在++n的情况下,编译器只执行增量,之后只使用n的当前值,当它写入cout时。

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