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