Int 被视为布尔值和运算符
Int considered as bool, & operator
我一直在为我的部分代码而苦苦挣扎一段时间,我终于发现问题在于一个简单的测试,它没有给我预期的结果。
if (2) //=> true
if (2 & true) //=> false
if (bool(2) & true) //=> true
我不明白的是为什么第二行结果为 false。我的理解是,在测试中,每个非零整数都被认为是真的。
位和 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节解决了这个问题,它以一种我不理解的方式这样做。 我似乎记得看到我的编译器让bool(2) == 2
,这是人们不会想到的。 这是否代表我的编译器中的错误或我记忆中的错误,我不知道。
但是,我怀疑您希望逻辑运算符&&
而不是按位运算符&
.
测验
要检查您的理解,请尝试
if (3 & true) //=> true
你明白为什么吗? (提示:3 的二进制表示形式是00000011。
你需要&&
而不是&
。
&&
是布尔and
运算符,而&
是二进制"and",因此2 & true
与0010 & 0001 = 0000 -> false
相同,而2 && true = true
。
&
在所有位之间做一个 AND(按位调用 AND),你需要的是&&
运算符(布尔 AND)。
2 是 '10',二进制中的 true 是 1 (01),因此结果10 & 01
为 0 。
bool(2) 将 2 转换为真,二进制为 01,01 & 01
为 01。
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 变量定义到C++布尔值转换
- 如何确保在使用基于布尔值的两个方法之一调用方法时避免分支预测错误
- 隐式常量/非常量运算符布尔
- 重载更少,则运算符返回相反的布尔值
- 将此布尔值传递给此函数的最有效方法是什么?
- 如何设置 c++ 类的布尔值?
- 使用 MAKEWORD / MAKEWPARAM 使用布尔值而不是布尔值
- 将流运算符>>评估为布尔值
- 为什么在布尔值上使用两个"!"运算符?
- 重载运算符<<输出布尔值.为什么
- 对布尔值使用逐位not运算符(~)是否会调用Undefined Behavior
- 在 c++ 中布尔值上不是运算符
- 在C++中,一元减号运算符如何处理布尔值
- 移动后是否应该 std::function::运算符布尔值返回 false
- Int 被视为布尔值和运算符
- 运算符 |= 表示 C++ 中的布尔值
- 错误:无法将运算符从分数转换为布尔值
- 如何创建一个合适的布尔值 员工::运算符==(const Employee & rhs) const
- 不能使用运算符 != 表示布尔值