#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 吗?
C 标准未定义执行各种 n++ / ++n 的顺序,并且可能会随着时间的推移或根据目标机器和/或优化选项而改变。然而,我认为,编译器仍然应该创建以原子方式执行每个 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 的当前值。
当然,两次递增到相同值的结果是未定义的,因此编译器的选择是完全合法的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)