代码之家  ›  专栏  ›  技术社区  ›  danatel

C++中可以比较两个布尔值吗?

  •  6
  • danatel  · 技术社区  · 16 年前

    下面的代码应该有效吗?

    bool b1 = true;
    bool b2 = 1 < 2;
    if (b1 == b2)
    {
    // do something
    }
    

    我怀疑并非所有的“真”都是平等的。

    8 回复  |  直到 16 年前
        1
  •  19
  •   Daniel Daranas    16 年前

    对一切真理都是平等的。

        2
  •  10
  •   J. Calleja    16 年前

    然而,一些 不良用途 bool变量的定义可能导致“未定义”的行为,可能看起来既不正确也不错误。例如,从整数读取未初始化的自动变量或直接内存副本的值。

      bool b1 = true; 
      bool b2 = true; 
      *((char*)&b1) = 3;
    
      if( b1 ) cout << "b1 is true" << endl;
      if( b2 ) cout << "b2 is true" << endl;
      if (b1 != b2) cout << "b2 is not equal to b1" << endl;
    

    在Visual Studio 9上,它显示:

    b1是真的

    b2是真的

    b2不等于b1

        3
  •  8
  •   Steve Fallows    16 年前

    是的,正如其他人所说的,在C++中,布尔可以被比较。你可能在想你从C。由于C没有布尔类型,布尔表示为整数。在布尔上下文中,任何非零整数都为真。但是,它们可能具有不同的位模式,因此不相等。所以C语言中的规则不是比较布尔值。

        4
  •  2
  •   AnT stands with Russia    16 年前

    将整数值指定给布尔对象(或使用整数值初始化布尔对象)时,它会隐式转换为 true false 1 2 . 这里没有“所有的真理都是平等的”问题。只有一个 .

    当然,一些编译器可能会采取“懒惰”的方法,保留多个不同的“真”,确保它们在比较时“都是平等的”,但我怀疑这是一种合理/可行的方法。

    换句话说,在一个合理的实现中,您不仅应该期望您的比较是正确的,而且应该期望一个更强大的比较也是正确的:

    bool b1 = true; 
    bool b2 = 1 < 2;
    if (memcmp(&b1, &b2, sizeof(bool)) == 0) {
      /* We should get in here */
    }
    

    语言并不能保证这一点,但在现实生活中,它确实很好地描述了情况的物理方面。

        5
  •  1
  •   T.E.D.    16 年前

    int 你可能有一个观点(尽管即使在那里,我认为这个特定的序列也可以)。在C++中,是的,这是安全的。

        6
  •  1
  •   David Thornley    16 年前

    在C++中, bool 是它自己的类型,具有两个可能的值 true false . 所有的比较都会如你所料。全部的 真的 布尔值是一样的,所有的布尔值都是一样的 假的 . 的确,并不是所有的表达式都可以求值 真的 假的 都是一样的。

    在C89中,要返回到我想返回的地方,任何零值(任何指针或数字类型)都是false,其他任何值都是true。这意味着真实值不一定彼此相等。 1 2 1 != 2 ,及 1 & 2 计算结果为0,这是false。

    C89伪值也有可能比较不相等,尽管它们在我使用过的每个实现中都会相等。空指针值是指针值的常量整数零转换。转换为指针值的非常量值0可能不是空指针(也有一些系统,其中空指针并非都是0位)。所以,, (void *)0 int i;...i = 0;...(void *)i

    然而,在C89中,所有打算返回布尔值的操作(如 && == ,例如),将返回1或0,以便 (1 == 3) == (4 ==3) .

        7
  •  0
  •   SF.    16 年前

    想象一下:

    有一个函数keyPressed(),该函数在未按下键时返回0,即按下键时的键数。

    您在循环中编写了一个简单的开关:

    if(keyPressed() && allow)
    ...
    

    现在你的公司在设备中引入了常开触发器,你需要一个pref。

    bool key_switches_on = getPref("KeySwitchesOn");
    
    if((keyPressed() && allow) == key_switches_on)
    ...
    

    if((keyPressed() == key_switches_on) && allow)
    

    突然间,只有1号键起作用了。

        8
  •  0
  •   Darrell    11 年前

    我已经阅读了所有这些关于为什么真是真以及为什么两个布尔变量可以用 == != 除非在极少数情况下,整数被强制为布尔或类似的东西。然而,我的问题和原来的海报完全一样。我有两个布尔变量,每个都是true,但是当我比较它们时,我发现它们不相等。这是一行代码,

    if (angDegDiff > 15 || scaleRatioA > 5 || scaleRatioB < -5 || (isParallel2 != isParallel1)) { return false; }

    以我为例,, angDegDiff = 0 scaleRatioA = 0 , scaleRatioB = 0 isParallel2 = true ,及 isParallel1 = true . 尽管如此,该语句的计算结果仍然是 true 唯一的办法就是 isParallel2 isParallel1 .

    没有使用任何花哨的方法来设置 isParallel1 isParallel2 . 它们的值由以下语句设置: _isParallel = true; . 稍后,使用以下语句将该值复制到另一个变量: isParallel1 = geom1->IsParallel(); 其实现方式如下: return _isParallel; .

    我的结论是,根据编译器的不同,两个布尔变量不能可靠地进行相等性比较。我使用微软Visual C++ 2005,版本0.0.50727.4039。

    结语:我用表达式替换了代码中的布尔比较, ((isParallel1 && !isParallel2) || (!isParallel1 && isParallel2))