Int被视为bool,&操作者

时间:2012-06-22 13:30:40

标签: c++ operators boolean int

我一直在用我的部分代码挣扎了一段时间,我终于发现问题在于一个简单的测试,它没有给我我期望的结果。

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

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

4 个答案:

答案 0 :(得分:13)

因为2true之间的按位和为false。

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

true施放到int的是1

所以2 & true2 & 1,这是假的 - 因为0000000000000010 & 0000000000000001 == 0。 (比特可能会有所不同)

bool(2) == 11 & 1true

答案 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 & true0010 & 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。