-3
#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 ?

4

1 回答 1

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,编译器只进行增量,然后在写入 cout 时只使用 n 的当前值。

当然,对同一个值进行两次递增的结果是未定义的,因此编译器的选择是完全合法的。

于 2013-08-11T17:31:36.997 回答