为什么带括号的AND表达式和不带括号的结果不同?

5
在C++中,4&1 == 0,而1&1 == 1。然而,4&1 != 1&1得到的结果是0,而不是1,但是(4&1) != (1&1)得到的结果是1,符合预期。为什么会这样?

4
请查看https://en.cppreference.com/w/cpp/language/operator_precedence。 - Brian61354270
!===的优先级高于& - Arty
“4&1 = 0”和“1&1 = 1”不是有效的表达式。 - paddy
@M.M 确实。我在问这个问题时想到了异或运算。我会进行更改。 - msapere
1个回答

6
关系运算符!=优先级比按位与&高。

因此,表达式

4 & 1 != 1 & 1

将被解析为。
4 & (1 != 1) & 1

3
C++ 的运算优先级规则很简单。乘法符号 * 比加法符号 + 优先级更高,其他的表达式只需要用括号来明确优先级即可。(嗯,一元运算通常比二元运算优先级更高……) - Yakk - Adam Nevraumont
@Yakk-AdamNevraumont C++的优先级规则在语法中占据了整整一页,而您提出的“解决方案”既不一致(为什么不使用括号来包含所有内容,包括*+?),也是程序员在该语言中文盲的明显迹象,至少对我来说是这样。 - user207421
1
@user20 因为智力是可替换的,学习C ++直到Bjarn的阅读水平更重要的事情还有很多。记忆100位数学常数或每个运算符的优先级都没有问题,但不应该被视为重要技能。 - Yakk - Adam Nevraumont
1
以同样的方式,4&1 == 0 就是 4 & (1 == 0) (4&0-> 0). - Jarod42
@Yakk-AdamNevraumont:我相信你省略了很多括号。x = (f() + (g(42)));(是的,在g(42)周围有额外的括号,因为我们不使用f() + g调用42 :) (类似于方法指针调用))。 - Jarod42
@jarod 那些是括号。 ;) - Yakk - Adam Nevraumont

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接