为什么下面的语句:
int a = 10;
a&8 == 8;
返回假(0)?
我知道它==的优先级高于&,但它仍然应该检查是否8 == 8并且应该评估为真,但它的评估为假。
任何人都可以通过推理帮助我。
为什么下面的语句:
int a = 10;
a&8 == 8;
返回假(0)?
我知道它==的优先级高于&,但它仍然应该检查是否8 == 8并且应该评估为真,但它的评估为假。
任何人都可以通过推理帮助我。
a & 8 == 8是a & (8 == 8)因为==优先级高于&(这里)
So 8 == 8is 1and a = 10which is 1010in binary
所以
00000001
& 00001010
--------
00000000
有趣的事实:虽然 false 是零,而 true 是 C 语言中的任何非零值。但是,如果相等运算符评估为真,则它保证评估为该值1,0否则。推荐人 C99 第 6.5.9 节第 3 段
8 == 8当转换为的结果int是1。
a & 8 == 8因此变为a & 1,如果a设置了 的最低有效位,则为真。这只会a是奇怪的。
既然a是 10,那么a & 1是0,因为 10 是偶数。
在&这种情况下,是按位与而不是逻辑与。逻辑与将导致表达式a && 8 == 8为真,因为运算符的两边都不是&&零。
但是,按位与会产生一个结果,其中“当且仅当设置了转换操作数中的每个相应位时,结果中的每个位都被设置”(C.11 §6.5.10 ¶4)。对于偶数,1s 位是0,所以按位与的结果1是0。
由于按位与的结果是0,因此表达式被视为假。
因为 10 是1010二进制的,结果8 == 8是 1。所以0001 & 1010是假的。
a&8 == 8,
= a&1 // because 8 == 8, is true
= 0 // 1010 & 1 = 0
因为8 == 8为真,在C中等于1,在C中1 & 10等于0,在C中为假。
a&8 == 8被解析为a & (8==8),与 相同a & 1。由于 a=10 甚至它的二进制表示在单位位置有一个 0,所以结果a & 1是0。
当您执行按位与 (&) 操作时,a&1(8==8) 为真,即 10 & 1 结果为全 0。O代表错误。
00000000 00001010 & 00000000 00001000 = 00000000 00000000 = 假(假设 int 为 16 位)