再次,一个愚蠢的问题。
#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
int i = 0;
i = i++;
cout<<i;
return 0;
}
我得到1
作为此程序的结果打印虽然我预期0:首先创建的临时对象等于0,然后i递增,然后返回临时对象并分配给i。只是根据:
5.2.6递增和递减[expr.post.incr] 1获得的价值 通过应用postfix ++是值 申请前的操作数 运营商。 [注意:价值 获得的是原件的副本 价值]
我在MS VC 2008和GCC下查了一下。它们给出了相同的结果,但至少gcc在递增字符串中发出警告。我哪里错了?
答案 0 :(得分:0)
的行为
i = i++;
未定义。如果单个表达式为变量分配两个不同的值,那么C ++规范说任何事情都可能发生 - 它可以采用它的旧值,两个新值中的一个,或几乎任何东西。这样做的原因是它允许编译器对简单表达式进行更积极的优化。编译器可以重新排列赋值和++
的执行顺序,例如,如果它认为它更有效。