当bool = true时,为什么补码运算符不起作用?

时间:2013-06-17 13:37:06

标签: 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;
}

输出:

0
1
1

为什么不打印以下内容?

0
1
0

4 个答案:

答案 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)

您应该使用逻辑运算符,而不是二元运算符。使用!代替~