为什么以下声明:
int a = 10;
a&8 == 8;
返回false(0)?
我知道==
优先于&
,但仍应检查8 == 8
是否应评估为true,但评估为false。
任何人都可以通过推理帮助我。
答案 0 :(得分:23)
a & 8 == 8
为a & (8 == 8)
,因为==
的优先级高于&
(here)
所以8 == 8
1
和a = 10
二进制为1010
所以
00000001
& 00001010
--------
00000000
有趣的事实:
虽然false是零,但是C语言中的任何非零值都是true。但是,如果等于运算符的计算结果为true,则保证以其他方式计算值1
和0
。推荐人C99第6.5.9节第3段
答案 1 :(得分:7)
转换为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
位为0
,因此按位和1
的结果为0
。
由于按位的结果为0
,表达式将被视为false。
答案 2 :(得分:5)
因为10是二进制1010
而8 == 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位)