运算符优先级和评估顺序

时间:2016-08-24 14:29:26

标签: c++ output operators operator-precedence

我无法理解这个程序的输出:

#include<iostream>
using namespace std;
int main()
{
    int x = 1 , y = 1, z = 1;
    cout << ( ++x || ++y && ++z ) << endl; //outputs 1;
    cout << x << " " << y << " " << z ;  //x = 2 , y = 1 , z = 1;
    return 0;
}

输出:

1
2 1 1

如果首先评估||,那么此输出就可以了,但this文章说&&的优先级高于||,因此必须首先评估。如果是这种情况,那么根据我的输出应该是:

1
1 2 2

因为++y && ++z会评估为true,因此++x不会被评估。

5 个答案:

答案 0 :(得分:7)

  

&&的优先级高于||,因此必须先进行评估。

没有。 Operator precedence仅确定在解析表达式时操作符将如何更紧密地绑定(如用圆括号)其参数,它不会影响评估顺序。在这种情况下,只是意味着++x || ++y && ++z将被解析为(++x) || (++y && ++z),而不是(++x || ++y) && (++z)

请注意,operator||的关联性是从左到右,因此首先会评估++x,并且由于短路而无法评估(++y && ++z)评估(除了重载operator||)。

答案 1 :(得分:5)

让我们把多余的parantheses放在:

( ++x || (++y && ++z ))

然后,如果(++y && ++z )为0,则很容易看到++x进行评估。因此,无论运算符优先级如何,都可以看到短暂的循环性质||表示仅在左侧为0时评估右侧。

(如果评估了右侧,请注意,如果++z不为0,则++y进行评估。)

答案 2 :(得分:4)

&#34;优先级&#34;影响分组,而不是顺序,并且意味着如果操作数&#34;属于&#34;可能存在任何歧义,则优先级较高的运算符会在其上获得第一个dib。

由于涉及两个二元运算符,因此有两种方法可以读取表达式 作为树,这些将是:

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


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

优先规则确定后一个树是在C ++中选择的,因为中间操作数++y&&分组,而不是||

&#34;短路&#34;这些运算符意味着评估必须从最左边的叶子开始(每个操作员必须首先评估其左腿,然后如果需要则评估其右侧)。
因此,首先评估++x||仅在++x为零时继续其右腿,而不是{。}}。

(从精彩和艺术图表中可以看出,无论++x&&的相对优先级如何,都必须首先评估||。)

答案 3 :(得分:0)

(++ x ||(++ y&amp;&amp; ++ z)) - 可以看作是布尔值 - 只评估++ x。它的int值是2,布尔值是1(真)。

答案 4 :(得分:-1)

此表达式

 ++x || ++y && ++z

相当于表达式

++x || ( ++y && ++z )

而不喜欢这个

 ( ++x || ++y ) && ++z

如果逻辑OR表达式的第一个操作数被计算为true(如在您的示例中那样),则不会计算( ++y && ++z )的第二个操作数。