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

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.

您正在寻找!运算符来反转布尔值.

  • 因为false使用unsigned int表示为"0x0000",而true可以是其他任何东西. (9认同)

cma*_*k89 6

正如其他人所说的那样,在补充运算符完成其工作之前,bool会被提升为整数.〜是一个按位运算符,因此反转整数的每个单独的位; 如果你将〜应用于00000001,结果是11111110.当你将它应用于32位有符号整数时,~1给你-2.如果您对此感到困惑,请看一下二进制转换器.例如:http://www.binaryconvert.com/result_signed_int.html?decimal = 045050

修改后的问题:

由于与上述相同的原因,对于真的有效.如果你翻转00000000(输出到32位),你会得到11111111 ...我相信整数是-1.比较布尔值时,任何-not- 0的内容都被认为是真的,而0中的任何一个都是假的.


Ral*_*zky 5

你可能想这样做:

b = !b;
Run Code Online (Sandbox Code Playgroud)

这是逻辑上的否定.你所做的是bool对一个整数进行逐位否定.第二次b = ~b;执行语句时,先前的值btrue.转换为整数,这给出了1其按位补码-2,因此被强制转换为bool true.因此,trueb仍将保持true,而false值将被分配true.这是由于C遗留问题.