#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?
答案 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时。
当然,两个增量到相同值的结果是未定义的,因此编译器的选择是完全合法的。