0

又是一个愚蠢的问题。

#include <stdio.h>
#include <iostream>
using namespace std;

int main()
{
 int i = 0;
 i = i++;
 cout<<i;

 return 0;
}

尽管我期望为 0,但由于该程序,我得到1了打印:首先创建了一个等于 0 的临时对象,然后 i 递增,然后返回临时对象并将其分配给 i。只是根据:

5.2.6 递增和递减[expr.post.incr] 1 应用后缀++得到的值是操作数在应用运算符之前的值。[注:得到的值是原值的副本]

我在 MS VC 2008 和 GCC 下检查了它。它们给出了相同的结果,尽管至少 gcc 在增量字符串中发出警告。我哪里错了?

4

1 回答 1

0

的行为

i = i++;

未定义。如果一个表达式为一个变量分配了两个不同的值,C++ 规范说任何事情都可能发生——它可以采用它的旧值、两个新值之一,或者几乎任何东西。这样做的原因是它允许编译器对简单表达式进行更积极的优化。编译器可以重新排列赋值和++执行的顺序,例如,如果它认为它更有效。

于 2011-01-08T23:40:27.607 回答