【问题标题】:How is the postfix and prefix increment operator evaluated in an expression? [duplicate]后缀和前缀自增运算符如何在表达式中求值? [复制]
【发布时间】:2013-08-11 17:09:46
【问题描述】:
#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++ post-increment pre-increment


【解决方案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 的情况下,编译器只进行增量,然后只使用n 的当前值,当它被写入 cout。

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

【讨论】:

  • 不只是它们的执行顺序是不确定的。这是整个程序的行为。所以,是的,根据语言定义,以不同的顺序进行不同的增量是可以的,就像重新格式化你的硬盘一样。
猜你喜欢
  • 2015-06-08
  • 2011-03-12
  • 1970-01-01
  • 1970-01-01
  • 2017-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多