【问题标题】:Bool type True and False布尔类型 True 和 False
【发布时间】:2013-12-19 00:51:29
【问题描述】:

我在玩 Bool 类型(布尔变量)并输入了这个:

#include <iostream>

int main(void)
{
using std::cout;
using std::cin;
using std::endl;

bool $ok = false & true;

if($ok == true)
{
    cout << "The value is True." << endl;
}
else if($ok == false)
{
    cout << "The value is false." << endl;
}

cin.get();
cin.get();
return 0;
}

我知道使用按位运算符 &amp; 和逻辑运算符 &amp;&amp; 之间的区别,但我看不出这如何产生假 (0) 值。我知道如果我交换按位运算符并使用+ 表达式0+1 将导致它评估为true。有人能解释一下为什么吗:

bool $ok = false & true;

评估为假?

【问题讨论】:

  • 你为什么认为它是真的?
  • 我可能会离开这里,但不会使用位运算符 '&' 与假和真预定义文字 (0 ,1) 一起产生真值吗?我不知道如何/为什么会或不会,这就是我寻求帮助的原因。
  • 你知道如何计算位与吗?如果没有,here's a reference。简短的回答,不。
  • 谢谢,我不是很了解,只知道'&&'和'&'的区别而已。我是自学成才,可以使用尽可能多的资源来学习。
  • 顺便说一句,如果您希望代码可移植,请不要在 C++ 中的变量名中使用 $。 stackoverflow.com/questions/7926394/in-variable-name

标签: c++ boolean visual-c++


【解决方案1】:

为什么会这样? false 转换为 0 值整数。 true 转换为非零值整数(通常为 1,但不能保证)。对于任何x,0 &amp; x 始终为0。 0 == false 定义了整数/布尔交互,因此输入了错误分支。


对于它的价值,在 0 和 1 的域中,0 为假,1 为真,* 映射到 AND,而 + 映射到 OR。鉴于此,我不太确定您为什么期望 + 和 &amp; 给出相同的结果。

x * y != 0 iff x != 0 and y != 0
x + y != 0 iff x != 0 or y != 0

还值得一提的是,对有符号类型进行按位运算往往不是一个好主意。如果您要将整数视为位域,请使用无符号整数类型,其中运算规则更加自然和直观。

【讨论】:

    【解决方案2】:

    假=0(0x00000000) 真=1(0x00000001)

    现在当我们对 (false & true) 进行按位和运算符时---(0&1=0)。

                0x00000000
             &  0x00000001
              -------------
               0x00000000
    

    因此结果为 0(0x00000000)

    【讨论】:

      【解决方案3】:

      这是因为false 为 0(当从布尔域转换为整数域时),而true 为 1(当从布尔域转换为整数域时)。

      false & true == 0 & 1 == 0 == false
      false + true == 0 + 1 == 1 == true
      

      如果&amp; 的魔力对你来说是个谜,there are lots of great resources on bitwise-and。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-17
        • 2012-09-12
        • 1970-01-01
        • 2015-09-06
        • 2015-10-15
        • 1970-01-01
        相关资源
        最近更新 更多