开发者

Operator precedence, which result is correct? [duplicate]

This question already has answers here: Closed 11 years ago.

Possible Duplicate:

Undefined behavior and sequence points

What is the value of x after this code?

int x = 5;
x = ++x + x++;

In Java, the result is 12, but in C++, the result is 13.

I googled the operator precedence of both Java and C++, and they look 开发者_JS百科the same. So why are the results different? Is it because of the compiler?


In Java it's defined to evaluate to 12. It evaluates like:

x = ++x + x++;
x = 6 + x++; // x is now 6
x = 6 + 6; // x is now 7
x = 12 // x is now 12

The left operand of the + (++x) is completely evaluated before the right due to Evaluate Left-Hand Operand First. See also this previous answer, and this one, on similar topics, with links to the standard.

In C++, it's undefined behavior because you're modifying x three times without an intervening sequence point.


Operator precedence governs how operands are grouped together for calculating the result. It doesn't necessarily govern the order of applying side effects.

In C++, the ++ operators will both be calculated before the + operator (although this only makes a difference in the ++x, because the value of x++ is the same as x). The side effect of incrementing x happens before the next sequence point in C++, and that's all we can say, and the only sequence point in that expression is after it is completely evaluated, including the assignment. Further, the result of modifying an object more than once between sequence points is explicitly undefined according to the Standard.

Given undefined behavior, the typical implementation will do something that depends on the details of how the implementation sequences defined behavior, and so you will often get a consistent result if you stick to one version of one compiler.


It is undefined behaviour in C++. See 5.4 in the standard.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜