评估==和&时的困惑

Har*_*esh 7 c evaluation operator-precedence

为什么以下声明:

int a = 10;
a&8 == 8; 
Run Code Online (Sandbox Code Playgroud)

return false(0)?

我知道它==有更多的优先权&,但它仍然应该检查8 == 8它是否应该评估为真,但它的评估为假.

任何人都可以通过推理帮助我.

pho*_*xis 23

a & 8 == 8a & (8 == 8)因为==优先级高于&(这里)

所以8 == 81a = 101010二进制

所以

  00000001
& 00001010
  --------
  00000000
Run Code Online (Sandbox Code Playgroud)

有趣的事实:虽然false是零,而C语言中的任何非零值都是true.但是,如果相等运算符的计算结果为true,则保证评估值10其他值.推荐人C99第6.5.9节第3段


jxh*_*jxh 7

8 == 8转换为的结果int1.

a & 8 == 8因此变为a & 1,如果设置了最低有效位,则为真a.这只是a奇怪的.

由于a是10,那么a & 1就是0,因为10是偶数.

&这种情况下是按位和,而不是逻辑和.逻辑 - 并且会导致表达式a && 8 == 8为真,因为&&运算符的两边都不为零.

但是,按位 - 并产生一个结果,"当且仅当转换后的操作数中的每个相应位都置位时,结果中的每个位都被置位"(C.11§6.5.104).对于偶数,1s位是0,所以bitwise-with的结果10.

由于bitwise-is的结果0,表达式被视为false.


Jey*_*ram 5

因为10是1010二进制的,结果8 == 8是1.所以0001 & 1010是假的.