我编写了这个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;
}
输出:
0
1
1
为什么不打印以下内容?
0
1
0
答案 0 :(得分:25)
这是由于C遗留算子机械化(也回顾~
是按位补码)。在执行操作之前,~
的积分操作数被提升为int,然后转换回bool
。所以你得到的就是(使用无符号32位表示)false
- &gt; 0
- &gt; 0xFFFFFFFF
- &gt; true
。然后true
- &gt; 1
- &gt; 0xFFFFFFFE
- &gt; 1
- &gt; true
。
您正在寻找!
运算符来反转布尔值。
答案 1 :(得分:6)
正如其他人所说的那样,在补语运算符完成工作之前,bool会被提升为整数。 〜是一个按位运算符,因此反转整数的每个单独的位;如果你将〜应用于00000001,结果是11111110.当你将它应用于32位有符号整数时,~1给你-2。如果您对此感到困惑,请看一下二进制转换器。例如:http://www.binaryconvert.com/result_signed_int.html?decimal=045050
修改后的问题:
由于与上述相同的原因,对于真的有效。如果你翻转00000000(输出到32位),你会得到11111111 ...我相信整数是-1。比较布尔值时,任何不是0的东西都被认为是真的,而0只是假的。
答案 2 :(得分:5)
你可能想这样做:
b = !b;
这是逻辑否定。你所做的是对bool
强制转换为整数的逐位否定。第二次执行语句b = ~b;
时,b
的先前值为true
。转换为整数,这会得到1
,其按位补码为-2
,因此会强制转换为bool true
。因此,true
的{{1}}值将保持b
,而true
值将被分配false
。这是由于C遗留问题。
答案 3 :(得分:2)
您应该使用逻辑运算符,而不是二元运算符。使用!
代替~
。