如果运算符具有最高优先级,则该子表达式适用于哪些子表达式?

What subexpressions does an operator apply to if it has the highest precedence?

提问人:rebecca wong 提问时间:10/3/2023 最后编辑:Jan Schultkerebecca wong 更新时间:10/4/2023 访问量:107

问:

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

C++ 表达式 运算符优先级

评论

10赞 pptaszni 10/3/2023
我想这是大学教授给你的练习吗?恕我直言,这种测验对编程学习 POV 没有任何价值。您可以为有关运算符优先级的这一部分添加红色,然后逐个进行处理。
2赞 Oersted 10/3/2023
虽然从理论的角度来看,这个问题可能很有趣,但我强烈反对这种代码,因为准确地说,它很难理解。依赖评估顺序和运算符优先级经常导致我犯错误......
2赞 Pepijn Kramer 10/3/2023
只需添加并明确您的意思即可。我不会让它通过代码审查。如果这是我老师的代码,那将是我的答案。(这甚至在考虑从 int 到 bool 的隐式类型转换之前)()
1赞 PaulMcKenzie 10/3/2023
@pptaszni -- 您可以在我看到的“这打印了什么?”中添加问题,如下所示: .如果这是作为家庭作业,这真的是浪费学生的时间,因为应该教授 C++ 的更多有趣和相关的方面。int a = 1; int b = 2; int x = ++b + ++a + b +a; cout << x;
1赞 molbdnilo 10/3/2023
这比 means that is 具有更高的优先级。也就是说,在 之前计算 。此外,is to as is to .>=||x >= y || z(x >= y) || z>=||&&||*+

答:

1赞 HolyBlackCat 10/3/2023 #1

我知道这具有最高的优先级,但这是否意味着与整个事情进行比较?或者只是.>=a(b || b == c && !b && !!a )b

好吧,让我们想想。假设你有 .从您使用的同一优先级表中,您可以看到该表的优先级高于 。这是否意味着乘以或只是?1 * 2 + 3*+12 + 32

3赞 molbdnilo 10/4/2023 #2

当运算符的优先级高于相邻运算符时,它会更紧密地“绑定”操作数; 方法。
(这是有道理的,因为你想成为“a 小于 b,或者 c 小于 d”,而不是“a 小于(b 或 c)小于 d”,这是无稽之谈。
x >= y || z(x >= y) || za < 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我编辑了它,试图让它更正确,同时保持对初学者的合理友好。