提问人:rebecca wong 提问时间:10/3/2023 最后编辑:Jan Schultkerebecca wong 更新时间:10/4/2023 访问量:107
如果运算符具有最高优先级,则该子表达式适用于哪些子表达式?
What subexpressions does an operator apply to if it has the highest precedence?
问:
int a = 1, b = 2, c = 3;
bool z = a >= b || b == c && !b && !!a;
cout << z << endl;
我想知道为什么打印此代码。0
我不知道从哪里开始,尽管我知道这具有最高的优先级。
这是否意味着它与所有 进行比较,还是仅与 ?>=
a
(b || b == c && !b && !!a)
b
答:
1赞
HolyBlackCat
10/3/2023
#1
我知道这具有最高的优先级,但这是否意味着与整个事情进行比较?或者只是.
>=
a
(b || b == c && !b && !!a )
b
好吧,让我们想想。假设你有 .从您使用的同一优先级表中,您可以看到该表的优先级高于 。这是否意味着乘以或只是?1 * 2 + 3
*
+
1
2 + 3
2
3赞
molbdnilo
10/4/2023
#2
当运算符的优先级高于相邻运算符时,它会更紧密地“绑定”操作数; 方法。
(这是有道理的,因为你想成为“a 小于 b,或者 c 小于 d”,而不是“a 小于(b 或 c)小于 d”,这是无稽之谈。x >= y || z
(x >= y) || z
a < b || c < d
要解决这个问题,请添加从最高优先级到最低优先级的括号。
具有最高的优先级,因此!
a >= b || b == c && (!b) && (!(!a))
接下来,关系运算符,
(a >= b) || b == c && (!b) && (!(!a))
然后是平等,
(a >= b) || (b == c) && (!b) && (!(!a))
然后,它关联到左边:&&
(a >= b) || (((b == c) && (!b)) && (!(!a)))
然后只剩下了,所以你不需要做任何事情。||
所以你有
(1 >= 2) || (((2 == 3) && (!2)) && (!(!1)))
这是
(1 >= 2) || (((2 == 3) && (2 == 0)) && (!(1 == 0)))
这是
false || ((false && false) && true)
这是
false
请注意,由于逻辑运算符“短路”,这实际上计算为
(1 >= 2) || (((2 == 3) && (!2)) && (!(!1)))
false || (((2 == 3) && (!2)) && (!(!1)))
((2 == 3) && (!2)) && (!(!1))
(false && (!2)) && (!(!1))
false && (!(!1))
false
但由于没有副作用,结果是一样的。
评论
2赞
Eric Postpischil
10/4/2023
回复“运算符具有更高的优先级意味着它首先得到评估”:不,它没有。优先级决定了表达式的结构,并且该结构对计算施加了部分排序(必须先计算操作的子表达式,然后才能在操作中使用它们),而不是总排序。in 的优先级高于 ,但编译器可以先计算。1+2 & 3*4
*
+
+
0赞
ABaumstumpf
10/4/2023
迂腐地说:C++甚至没有运算符优先级的概念 - 只有关联性和形成有效表达式的内容 - 优先级只是当我们谈论运算符时对行为进行分组的好方法。
0赞
molbdnilo
10/4/2023
@EricPostpischil我编辑了它,试图让它更正确,同时保持对初学者的合理友好。
评论
(
)
int a = 1; int b = 2; int x = ++b + ++a + b +a; cout << x;
>=
||
x >= y || z
(x >= y) || z
>=
||
&&
||
*
+