3

我一直在为我的部分代码苦苦挣扎,我终于发现问题出在一个简单的测试上,它没有给我预期的结果。

if (2) //=> true
if (2 & true) //=> false
if (bool(2) & true) //=> true

我不明白为什么第二行会导致错误。我的理解是,每个非零整数在测试中都被认为是真的。

4

4 回答 4

13

因为和之间的2true是假的。

&(按位运算符)不同于&&(逻辑运算符)。

true转换int1.

哪个是假2 & true的也是如此- 因为. (位可能会有所不同)2 & 10000000000000010 & 0000000000000001 == 0

bool(2) == 11 & 1true

于 2012-06-22T13:32:08.990 回答
4
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。)

于 2012-06-22T13:43:23.013 回答
3

你需要&&而不是&.

&&是布尔and运算符,而&是二进制 'and' 所以与while2 & true相同。0010 & 0001 = 0000 -> false2 && true = true

于 2012-06-22T13:32:22.257 回答
1

&在所有位之间进行AND(调用按位AND),您需要的是&&运算符(布尔AND)。

二进制中的 2 是 '10' 并且 true 是二进制中的 1 (01),因此结果10 & 01是 0 。

bool(2) 将 2 转换为 true ,二进制为 01,01 & 01为 01。

于 2012-06-22T13:34:35.267 回答