如何在表达式中计算后缀和前缀增量运算符
How is the postfix and prefix increment operator evaluated in an expression?
#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时。
当然,将两个增量增加到相同值的结果是不确定的,因此编译器的选择是完全合法的。
相关文章:
- 编译器如何在前缀和 postix 运算符之间进行区分?
- 迭代器类的重载前缀增量运算符会引发分段错误
- 如何在自定义对象的<<运算符中添加自定义前缀
- C++编译器如何扩展前缀和后缀运算符++()?
- 指向重载前缀和后缀运算符中的类对象的指针
- C++如何知道在重载运算符时增量++是前缀或后缀
- 重复使用前缀 ++ 运算符时的未定义行为
- 带有线程的运算符++(前缀)
- 重载运算符<<C++中带前缀
- 前缀和后缀运算符 C++
- 编译器如何翻译后缀/前缀运算符
- C++ 加法 (+) 的前缀和后修复运算符重载(不是 ++ 或 --)
- GCC 前缀增量运算符在将值传递给函数时行为异常
- 涡轮增压C++(非可视)(后缀和前缀运算符)
- 前缀运算符的实现
- 如何计算前缀和后缀运算符的组合
- 为什么我们必须从一元前缀运算符重载返回 const 引用
- C++后缀/前缀运算符重载作为非成员函数
- 实现前缀运算符++
- Visual Studio 2010 - 前缀运算符 C++和数组索引中的奇怪性