评估==和&的困惑

时间:2013-08-06 08:37:57

标签: c evaluation operator-precedence

为什么以下声明:

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

返回false(0)?

我知道==优先于&,但仍应检查8 == 8是否应评估为true,但评估为false。

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

7 个答案:

答案 0 :(得分:23)

a & 8 == 8a & (8 == 8),因为==的优先级高于&here

所以8 == 8 1a = 10二进制为1010

所以

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

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

答案 1 :(得分:7)

转换为8 == 8int的结果为1

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

由于a为10,因此a & 10,因为10为偶数。

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

但是,按位 - 并产生一个结果,其中“当且仅当转换后的操作数中的每个相应位都置位时,结果中的每个位都被置位”(C.11§6.5.10¶4)。对于偶数,1位为0,因此按位和1的结果为0

由于按位的结果为0,表达式将被视为false。

答案 2 :(得分:5)

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

答案 3 :(得分:3)

a&8 == 8,

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

= 0 // 1010 & 1 = 0

答案 4 :(得分:2)

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

答案 5 :(得分:1)

a&8 == 8被解析为a & (8==8),与a & 1相同。由于a = 10甚至其二进制表示在单位位置中为0,因此a & 1的结果为0

答案 6 :(得分:1)

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

<00> 00000000 00001010&amp; 00000000 00001000 = 00000000 00000000 = False(假设int为16位)