[英]Operator precedence and evaluation order
我无法理解这个程序的输出:
#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
如果||
首先计算那么这个输出是好的,但是这个文章说, &&
比一个更高的优先级||
,因此必须首先评估。 如果是这种情况那么根据我的输出应该是:
1
1 2 2
因为++y && ++z
将评估为true
,因此不会评估++x
。
&&
的优先级高于||
,因此必须首先评估。
否。 运算符优先级仅确定运算符在解析表达式时如何更严格地(如通过括号)绑定到其参数,它不会影响评估顺序。 在这种情况下,它只意味着++x || ++y && ++z
++x || ++y && ++z
将被解析为(++x) || (++y && ++z)
(++x) || (++y && ++z)
,而不是(++x || ++y) && (++z)
。
注意operator||
的关联性operator||
从左到右,所以首先评估++x
,并且由于短路评估(除了重载operator||
),不会评估(++y && ++z)
)。
让我们把多余的parantheses放在:
( ++x || (++y && ++z ))
然后很容易看出(++y && ++z )
只有在++x
为0时才会被评估。所以你可以看到,无论运算符优先级如何, ||
的短循环特性 表示仅在左侧为0时评估右侧。
(如果评估了右侧,请注意, 只有当++y
不为0时才会评估++z
)
“优先级”影响分组,而不是顺序,并且意味着如果操作数“属于”哪个运算符可能存在任何歧义,则具有较高优先级的运算符将获得第一个dib。
由于涉及两个二元运算符,因此有两种方法可以读取表达式。
作为树木,这些将是:
and
/\
or ++z [(++x || ++y) && ++z]
/ \
++x ++y
or
/\
++x and [++x || (++y && ++z)]
/ \
++y ++z
优先规则确定后一个树是在C ++中选择的,因为中间操作数++y
与&&
组合,而不是与||
。
这些运算符的“短路”意味着评估必须从最左边的叶子开始(每个操作员必须首先评估其左腿,然后如果需要则评估其右侧)。
因此,首先评估++x
和||
如果++x
为零,则仅继续其右腿,而不是。
(从精彩和艺术图表中可以看出,无论&&
和||
的相对优先级如何,都必须首先评估++x
。)
(++ x ||(++ y && ++ z)) - 可以看作是布尔值 - 只评估++ x。 其int值为2,布尔值为1(true)。
这个表达
++x || ++y && ++z
等同于表达
++x || ( ++y && ++z )
而不是这样
( ++x || ++y ) && ++z
如果逻辑OR表达式的第一个操作数被计算为true(如在您的示例中),则不计算第二个操作数( ++y && ++z )
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.