开发者

Operator precedence for "<<" and "++" in VS2008 with optimization

I'm stuck with a weird VS2008 C++ issue, that lo开发者_开发问答oks like operator precedence is not respected.

My question is what is the output of this:

int i = 0;  
std::cout << ((i != 0) ? "Not zero " : "zero ") << ++i << std::endl;  

Normally the ++ has precedence over the <<, right? Or is the << considered like a function call giving it a higher precedence than the ++? What is the 100% correct standard answer to this?

To check, I created a new empty project (VS2008 console app), pasted only this code in the main and here are the results:

Debug|Win32: “zero 1”  
Release|Win32: “zero 1”  
Debug|x64: “zero 1”  
Release|x64: “Not zero 1”

Btw, the following example produces the exact same results:

i = 0;  
printf("%s %d\n", ((i != 0) ? "Not zero" : "zero"), ++i);  

And also changing the type of optimization in release has no effect, but disabling optimization outputs “zero 1” like other configurations.


This is nothing to do with operator precedence.
You are using << which is syntactic sugar for a function call:

std::cout << ((i != 0) ? "Not zero " : "zero ") << ++i << std::endl; 

// Equivalent to:

operator<<(operator<<(operator<<(std::cout, ((i != 0) ? "Not zero " : "zero ")), ++i), std::endl);

The only rule here is that a parameter must be fully evaluated before the function is called. There are no restrictions on what order the parameters are evaluated or even if their evaluation is interleaved with calls (or even partially evaluated).

Interpretation 1:

1) ((i != 0) ? "Not zero " : "zero "))
2) ++i
3) operator<<(std::cout, (1));
4) operator<<((3), (2));
5) operator<<((4), std::endl);

Note: The restrictions are:

 A) (1) happens before (3)
 B) (2) happens before (4)
 C) (3) happens before (4)
 D) (4) happens before (5)

Given these restrictions we could re-order as follows.

Interpretation 2:

1) ++i
2) ((i != 0) ? "Not zero " : "zero "))
3) operator<<(std::cout, (2));
4) operator<<((3), (1));
5) operator<<((4), std::endl);

Interpretation 3:

1) ((i != 0) ? "Not zero " : "zero "))
2) operator<<(std::cout, (1));
3) ++i
4) operator<<((2), (3));
5) operator<<((4), std::endl);
0

上一篇:

下一篇:

精彩评论

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

最新问答

问答排行榜