【问题标题】:Why is the complement operator not working when bool = true?为什么当 bool = true 时补码运算符不起作用?
【发布时间】:2013-06-13 11:43:03
【问题描述】:

我已经编写了这个 C++ 程序,但我无法理解为什么它在第三个 cout 语句中打印 1

#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

【问题讨论】:

  • 真的不知道为什么有人投票关闭。
  • +1 @vikiiii - 不幸的是,否决票和投票关闭是 stackexchange 的弱点,我相信因为它们以匿名方式发生。
  • 所以您基本上使用了错误的运算符并想知道为什么它给您的结果不是您所期望的?

标签: c++ boolean complement


【解决方案1】:

这是由于 C 传统运算符机械化(还记得 ~按位 补码)。 ~ 的整型操作数在执行操作之前被提升为 int,然后转换回 bool。所以你得到的是(使用无符号 32 位表示)false -> 0 -> 0xFFFFFFFF -> true。然后true -> 1 -> 0xFFFFFFFE -> 1 -> true

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

【讨论】:

  • 因为 false 使用 unsigned int 表示为 0x0000,而 true 可以是其他任何值。
【解决方案2】:

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

对于您修改后的问题:

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

【讨论】:

    【解决方案3】:

    你可能想这样做:

    b = !b;
    

    这是逻辑否定。您所做的是将 bool 强制转换为整数的按位否定。第二次执行b = ~b;语句时,b的优先值为true。转换为整数,这给出了1,其按位补码为-2,因此转换回布尔true。因此,btrue 值将保持为 true,而 false 的值将分配给 true。这是由于 C 遗留问题。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-09
        • 2022-06-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多