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

How is the postfix and prefix increment operator evaluated in an expression?

本文关键字:前缀 运算符 后缀 计算 表达式      更新时间:2023-10-16
#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吗?

执行各种 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时。

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