19

我已经编写了这个 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

4 回答 4

26

这是由于 C 遗留的运算符机械化(还记得那~按位补码)。整数操作数 to~在执行操作之前被提升为 int ,然后转换回bool. 如此有效地,您得到的是(使用无符号 32 位表示)false-> 0-> 0xFFFFFFFF-> true。然后true-> 1-> 0xFFFFFFFE-> 1-> true

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

于 2013-06-17T13:41:59.380 回答
7

你可能想要这样做:

b = !b;

这是逻辑否定。您所做的是将强制bool转换为整数的按位否定。第二次b = ~b;执行语句时,之前的b值为true。转换为一个整数,这给出了1它的按位补码-2,因此转换回 bool true。因此,trueb将保留true,而false值将被赋值true。这是由于 C 遗留问题。

于 2013-06-17T13:38:52.943 回答
7

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

对于您修改后的问题:

出于与上述相同的原因,False to true 起作用。如果你翻转 00000000(到 32 位),你会得到 11111111... 我相信它是整数 -1。在比较布尔值时,任何非 0 都被认为是真的,而只有 0 是假的。

于 2013-06-17T13:55:54.320 回答
2

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

于 2013-06-17T13:47:37.423 回答