vik*_*iii 19 c++ boolean complement
我编写了这个C++程序,我无法理解为什么它1在第三个cout语句中打印.
#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;
}
Run Code Online (Sandbox Code Playgroud)
输出:
0
1
1
Run Code Online (Sandbox Code Playgroud)
为什么不打印以下内容?
0
1
0
Run Code Online (Sandbox Code Playgroud)
Mar*_*k B 25
这是由于C传统的操作员机械化(也回想起~是按位补码).~在执行操作之前将积分操作数提升为int,然后转换回bool.所以你得到的就是(使用无符号32位表示)false- > 0- > 0xFFFFFFFF- > true.然后true- > 1- > 0xFFFFFFFE- > 1- > true.
您正在寻找!运算符来反转布尔值.
正如其他人所说的那样,在补充运算符完成其工作之前,bool会被提升为整数.〜是一个按位运算符,因此反转整数的每个单独的位; 如果你将〜应用于00000001,结果是11111110.当你将它应用于32位有符号整数时,~1给你-2.如果您对此感到困惑,请看一下二进制转换器.例如:http://www.binaryconvert.com/result_signed_int.html?decimal = 045050
修改后的问题:
由于与上述相同的原因,对于真的有效.如果你翻转00000000(输出到32位),你会得到11111111 ...我相信整数是-1.比较布尔值时,任何-not- 0的内容都被认为是真的,而0中的任何一个都是假的.
你可能想这样做:
b = !b;
Run Code Online (Sandbox Code Playgroud)
这是逻辑上的否定.你所做的是bool对一个整数进行逐位否定.第二次b = ~b;执行语句时,先前的值b是true.转换为整数,这给出了1其按位补码-2,因此被强制转换为bool true.因此,true值b仍将保持true,而false值将被分配true.这是由于C遗留问题.