我无法理解这个程序的输出:
#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
不会被评估。
答案 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 )
的第二个操作数。