【发布时间】:2013-08-06 08:37:57
【问题描述】:
为什么下面的说法:
int a = 10;
a&8 == 8;
返回假(0)?
我知道== 比& 具有更高的优先级,但它仍然应该检查8 == 8 是否应该评估为true,但评估为false。
谁能帮我推理一下。
【问题讨论】:
标签: c evaluation operator-precedence
为什么下面的说法:
int a = 10;
a&8 == 8;
返回假(0)?
我知道== 比& 具有更高的优先级,但它仍然应该检查8 == 8 是否应该评估为true,但评估为false。
谁能帮我推理一下。
【问题讨论】:
标签: c evaluation operator-precedence
a & 8 == 8 是a & (8 == 8),因为== 的优先级高于& (here)
所以8 == 8 是1 和a = 10 这是1010 二进制
所以
00000001
& 00001010
--------
00000000
有趣的事实:
尽管 false 是零,而 true 是 C 语言中的任何非零值。但是,如果相等运算符评估为真,则它保证评估为值 1 和 0 否则。推荐人 C99 第 6.5.9 节第 3 段
【讨论】:
8 == 8 转换为int 的结果是1。
a & 8 == 8 因此变为a & 1,如果设置了a 的最低有效位,则为真。这只适用于 a 是奇怪的。
由于a 是10,那么a & 1 是0,因为10 是偶数。
本例中的& 是位与,而不是逻辑与。逻辑与将导致表达式 a && 8 == 8 为真,因为 && 运算符的两边都不是零。
但是,按位-and 会产生一个结果,其中“当且仅当设置了转换操作数中的每个相应位时,结果中的每个位都被设置”(C.11 §6.5.10 ¶4)。对于偶数,1s 位是0,所以按位与1 的结果是0。
由于按位与的结果是0,因此表达式被视为假。
【讨论】:
因为 10 在二进制中是 1010,而 8 == 8 的结果是 1。所以 0001 & 1010 是假的。
【讨论】:
a&8 == 8,
= a&1 // because 8 == 8, is true
= 0 // 1010 & 1 = 0
【讨论】:
因为8 == 8 为真,在C 中等于1,1 & 10 等于0,在C 中为假。
【讨论】:
当您执行按位与 (&) 运算时,a&1(8==8) 为真,即 10 & 1 结果为全 0。 O代表假。
00000000 00001010 & 00000000 00001000 = 00000000 00000000 = False(假设 int 为 16 位)
【讨论】:
a&8 == 8被解析为a & (8==8),与a & 1相同。由于 a=10 甚至它的二进制表示在单位位置都有一个 0,所以a & 1 的结果是0。
【讨论】: