为什么当bool = true时补码运算符不起作用?
Why is the complement operator not working when bool = true?
我写了这个c++程序,我不明白为什么在第三个cout
语句中打印1
#include<iostream>
using namespace std;
int main()
{
bool b = false;
cout << b << "n"; // Print 0
b = ~b;
cout << b << "n"; // Print 1
b = ~b;
cout << b << "n"; // Print 1 **Why?**
return 0;
}
输出:0
1
1
为什么不打印以下内容?
0
1
0
这是由于C传统操作器机械化(还记得~
是位补码)。~
的整型操作数在执行操作之前被提升为int,然后再转换回bool
。所以有效地你得到的是(使用无符号32位表示)false
-> 0
-> 0xFFFFFFFF
-> true
。true
-> 1
-> 0xFFFFFFFE
-> 1
-> true
您正在寻找!
运算符来反转布尔值
您可能想这样做:
b = !b;
是逻辑否定。您所做的是将bool
转换为整数的按位否定。第二次执行语句b = ~b;
时,b
的前一个值是true
。将1
转换为整数,其按位补码为-2
,因此将true
转换为bool类型。因此,b
的true
值将保持true
,而false
值将分配给true
。这是由于C的遗留问题。
正如大多数人所说的那样,在补算符完成工作之前,bool值被提升为整数。~是位运算符,因此对整数的每个位进行反转;如果对00000001应用~,结果是11111110。当你把它应用到一个32位有符号整数时,~1得到-2。如果你不知道为什么,只要看看二进制转换器。例如:http://www.binaryconvert.com/result_signed_int.html?decimal=045050
对于你修改后的问题:
从False到true的工作原理与上述相同。如果你把00000000(转换成32位),你会得到11111111…我认为是-1的整数形式。当比较布尔值时,任何非- 0的值都被认为是真值,而0单独为假。
应该使用逻辑运算符,而不是二进制运算符。使用!
代替~
相关文章:
- 为什么比较运算符如此快速
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 增量运算符与后缀混淆
- 一个关于在C++中重载布尔运算符的问题
- 运算符C++ "delete []"仅删除 2 个前值
- 模板类无法识别友元运算符
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 关闭||运算符优化
- 通过继承类使用来自不同命名空间的运算符
- C++Cast运算符过载
- 如何使用AngelScript注册SFML Vector2运算符
- 重载元组索引运算符-C++
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 布尔比较运算符是如何在C++中工作的
- 重载运算符new[]的行为取决于析构函数
- 为什么当bool = true时补码运算符不起作用?