7

为什么下面的语句:

int a = 10;
a&8 == 8; 

返回假(0)?

我知道它==的优先级高于&,但它仍然应该检查是否8 == 8并且应该评估为真,但它的评估为假。

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

4

7 回答 7

23

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

So 8 == 8is 1and a = 10which is 1010in binary

所以

  00000001
& 00001010
  --------
  00000000

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

于 2013-08-06T08:42:19.260 回答
7

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

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

既然a是 10,那么a & 10,因为 10 是偶数。

&这种情况下,是按位与而不是逻辑与。逻辑与将导致表达式a && 8 == 8为真,因为运算符的两边都不是&&零。

但是,按位与会产生一个结果,其中“当且仅当设置了转换操作数中的每个相应位时,结果中的每个位都被设置”(C.11 §6.5.10 ¶4)。对于偶数,1s 位是0,所以按位与的结果10

由于按位与的结果是0,因此表达式被视为假。

于 2013-08-06T08:42:11.477 回答
5

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

于 2013-08-06T08:42:36.873 回答
3
a&8 == 8,

= a&1 // because 8 == 8, is true

= 0 // 1010 & 1 = 0
于 2013-08-06T08:44:41.693 回答
2

因为8 == 8为真,在C中等于1,在C中1 & 10等于0,在C中为假。

于 2013-08-06T08:43:03.560 回答
1

a&8 == 8被解析为a & (8==8),与 相同a & 1。由于 a=10 甚至它的二进制表示在单位位置有一个 0,所以结果a & 10

于 2013-08-06T08:42:19.153 回答
1

当您执行按位与 (&) 操作时,a&1(8==8) 为真,即 10 & 1 结果为全 0。O代表错误。

00000000 00001010 & 00000000 00001000 = 00000000 00000000 = 假(假设 int 为 16 位)

于 2013-08-06T08:47:23.913 回答