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