为什么下面的语句:
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 == 8
is 1
and a = 10
which is 1010
in 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)。对于偶数,1
s 位是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 位)