C 评估中的混乱==和&;

C 评估中的混乱==和&;,c,evaluation,operator-precedence,C,Evaluation,Operator Precedence,为什么会出现以下情况: int a = 10; a&8 == 8; 返回false(0) 我知道=的优先级高于&,但它仍然应该检查8==8,它应该计算为true,但它的计算为false 谁能帮我推理一下。当转换为int时,8==8的结果是1 a&8==8因此变为a&1,如果设置了a的最低有效位,则为真。这只适用于a是奇数 既然a是10,那么a&1就是0,因为10是偶数 本例中的&是按位and,而不是逻辑and。逻辑and会导致表达式A&&8==8为真,因为&&运算符的两侧都不是零 但

为什么会出现以下情况:

int a = 10;
a&8 == 8; 
返回false(0)

我知道
=
的优先级高于
&
,但它仍然应该检查
8==8
,它应该计算为true,但它的计算为false


谁能帮我推理一下。

当转换为
int
时,
8==8
的结果是
1

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

既然
a
是10,那么
a&1
就是
0
,因为10是偶数

本例中的
&
是按位and,而不是逻辑and。逻辑and会导致表达式
A&&8==8
为真,因为
&&
运算符的两侧都不是零

但是,按位and生成一个结果,其中“当且仅当已转换操作数中的每个对应位都已设置时,才设置结果中的每个位”(C.11§6.5.10¨4)。对于偶数,
1
s位为
0
,因此按位与
1
的结果为
0


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

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

所以
8==8
1
a=10
在二进制中是
1010

所以

有趣的事实
虽然false是零,true是C语言中的任何非零值。但是,如果相等运算符的计算结果为true,则它保证计算值为
1
,否则为
0
。参考C99第6.5.9节第3段

a&8==8
被解析为
a&(8==8)
,与
a&1
相同。由于a=10是偶数,它的二进制表示在单位位置有一个0,因此
a&1
的结果是
0
,因为10是二进制的
1010
,而
8==8
的结果是1。所以
0001&1010
是假的。

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

当您执行按位and(&)运算时,a&1(8==8)是真的,即所有0的结果都是10&1。O代表错误

a&8 == 8,

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

= 0 // 1010 & 1 = 0
00000000 00001010&00000000 00001000=00000000 00000000=False(假定int为16位)

a&8 == 8,

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

= 0 // 1010 & 1 = 0