非常常见的表达评估

时间:2013-08-05 14:05:08

标签: c++ expression

解决方法是什么:

int i=5;
a= ++i + ++i + ++i;

如果我们按正常的从右到左评估,结果应为21(6 + 7 + 8)。

我记得在学校读书时答案是24(8 + 8 + 8)

但是我在CodeBlocks上试过,www.ideone.com,即gcc 4.8.1编译器,现在我得到22。 有人可以解释原因吗

2 个答案:

答案 0 :(得分:0)

该表达式中没有Sequence Points,因此您无法解决它,它是未定义/编译器相关的。

答案 1 :(得分:0)

它是由C / C ++标准undefined or implementation-defined behavior定义的。语言标准指定行为,它允许编译器实现选择(并且通常记录在案)。

另请参阅另一个StackOverflow问题:Could anyone explain these undefined behaviors (i = i++ + ++i , i = i++, etc…)


GCC在您的示例中所做的是以下内容:

int i = 5;
a = ++i + (++i + ++i);  // it first gets the value of i and increments it two times
a = ++i + (7 + 7);  // it then reads the new value of i, does the addition and save it as a constant in the stack
a = ++i + 14;  // it then gets the value of i and increments it
a = 8 + 14;  // it then reads the new value of i and add it to the constant
a = 22;