我一直在用我的部分代码挣扎了一段时间,我终于发现问题在于一个简单的测试,它没有给我我期望的结果。
if (2) //=> true
if (2 & true) //=> false
if (bool(2) & true) //=> true
我不明白为什么第二行导致错误。 我的理解是在测试中每个非零整数都被认为是真的。
答案 0 :(得分:13)
因为2
和true
之间的按位和为false。
&
(按位运算符)与&&
(逻辑运算符)不同。
true
施放到int
的是1
。
所以2 & true
是2 & 1
,这是假的 - 因为0000000000000010 & 0000000000000001 == 0
。 (比特可能会有所不同)
bool(2) == 1
和1 & 1
为true
。
答案 1 :(得分:4)
if (2) //=> true
到目前为止,非常好。
if (2 & true) //=> false
这里的条件评估为2 & 1 == 0
,因为&
是一个按位运算符,2和1分别是00000010和00000001二进制。
if (bool(2) & true) //=> true
有趣的是,在我的编译器中,我似乎回想起在某些情况下的不稳定行为;而且,如果教派。 C ++ 11标准的4.12解决了这个问题,它是以我不理解的方式解决的。我似乎记得看到我的编译器让bool(2) == 2
,这是人们不会期望的。这是代表编译器中的错误还是我的回忆中的错误,我不知道。
我怀疑你想要逻辑运算符&&
而不是按位运算符&
。
<强>测验强>
要检查您的理解,请尝试
if (3 & true) //=> true
你明白为什么吗? (提示:3的二进制表示是00000011。)
答案 2 :(得分:3)
您需要&&
而不是&
。
&&
是布尔and
运算符,而&
是二进制'和',因此2 & true
与0010 & 0001 = 0000 -> false
相同,而2 && true = true
}。
答案 3 :(得分:1)
&
在所有位之间执行AND(调用按位AND),您需要的是&&
运算符(布尔AND)。
2是'10',而二进制中的true是1(01),因此结果10 & 01
为0。
bool(2)将2转换为true,二进制为01,01 & 01
为01。