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

2024-01-06

#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(使用前将#替换为@)

如何在表达式中计算后缀和前缀增量运算符? [复制] 的相关文章

随机推荐