Int 被视为布尔值和运算符

Int considered as bool, & operator

本文关键字:运算符 布尔值 Int      更新时间:2023-10-16

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

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

我不明白的是为什么第二行结果为 false。我的理解是,在测试中,每个非零整数都被认为是真的。

因为按

位和 2true 之间的是假的。

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

trueint1 .

所以2 & true 2 & 1这是错误的——因为0000000000000010 & 0000000000000001 == 0.(位可能会有所不同)

bool(2) == 11 & 1true

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。

你需要&&而不是&

&&是布尔and运算符,而&是二进制"and",因此2 & true0010 & 0001 = 0000 -> false相同,而2 && true = true

&在所有位之间做一个 AND(按位调用 AND),你需要的是&&运算符(布尔 AND)。

二进制中的

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

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