Operator precedence and evaluation order

前端 未结 5 2178
梦如初夏
梦如初夏 2021-02-09 05:37

I can\'t understand output of this program:

#include
using namespace std;
int main()
{
    int x = 1 , y = 1, z = 1;
    cout << ( ++x || +         


        
5条回答
  •  礼貌的吻别
    2021-02-09 06:30

    "Precedence" affects grouping, not order, and means that if there could be any ambiguity regarding which operator an operand "belongs to", the operator with the higher precedence gets first dibs on it.

    Since there are two binary operators involved, there are two ways you can read the expression.
    As trees, these would be:

        and
        /\
       or ++z       [(++x || ++y) && ++z]
      / \
    ++x ++y 
    
    
       or
       /\
    ++x  and       [++x || (++y && ++z)]
         / \
      ++y ++z
    

    The precedence rules determine that the latter tree is chosen in C++, since the middle operand, ++y, is grouped with &&, not with ||.

    The "short-circuiting" of these operators means that evaluation must start at the leftmost leaf (each operator must first evaluate its left leg, then its right if it needs to).
    Thus, ++x is evaluated first, and || only continues with its right leg if ++x is zero, which it isn't.

    (As can be seen from the wonderful and artistic diagrams, ++x must be evaluated first regardless of the relative precedence of && and ||.)

提交回复
热议问题