操作"假<真"明确定义?

时间:2014-10-01 14:40:30

标签: c++ boolean language-lawyer comparison-operators

C ++规范是否定义:

  1. 小于'的存在operator是否为布尔参数,如果是,
  2. 4参数排列的结果?
  3. 换句话说,是由规范定义的以下操作的结果吗?

    false < false
    false < true
    true < false
    true < true
    

    在我的设置(Centos 7,gcc 4.8.2)中,下面的代码吐出了我所期望的内容(假设C&C表示假为0且真为1的历史记录):

    false < false = false
    false < true = true
    true < false = false
    true < true = false
    

    虽然我非常确定大多数(所有?)编译器会提供相同的输出,这是否由C ++规范立法?或者是一个混淆但符合规范的编译器,允许判断true是否小于false?

    #include <iostream>
    
    const char * s(bool a)
    {
      return (a ? "true" : "false");
    }
    
    void test(bool a, bool b)
    {
      std::cout << s(a) << " < " << s(b) << " = " << s(a < b) << std::endl;
    }
    
    int main(int argc, char* argv[])
    {
      test(false, false);
      test(false, true);
      test(true, false);
      test(true, true);
      return 0;
    }
    

4 个答案:

答案 0 :(得分:206)

TL; DR:

根据C ++标准草案对操作进行了很好的定义。

详细

我们可以通过转到draft C++ standard部分5.9 关系运算符来看到(强调我的前进):

  

操作数应具有算术,枚举或指针类型,或键入std :: nullptr_t。运营商   &LT; (小于),&gt; (大于),&lt; =(小于或等于),&gt; =(大于或等于)所有产量   虚假或真实。结果的类型是bool

和bools是3.9.1基本类型

中的arithematic类型
  

类型 bool ,char,char16_t,char32_t,wchar_t以及有符号和无符号整数类型是统一的   称为整数类型。

  

积分和浮点类型统称为算术   类型。

truefalse是来自2.14.6布尔文字的布尔文字:

boolean-literal:
    false
    true

回到5.9部分进一步查看关系运算符的机制,它说:

  

通常的算术转换是在算术或枚举类型的操作数上执行的。

通常的算术转换5部分中介绍:

  

否则,应在两个操作数上执行整体促销(4.5)

和第4.5部分说:

  

bool类型的prvalue可以转换为int类型的prvalue,false变为零和true   成为一个。

所以表达式:

false < false
false < true
true < false
true < true

使用这些规则成为:

0 < 0
0 < 1
1 < 0
1 < 1

答案 1 :(得分:63)

布尔值受常规整数促销的约束,false定义为0true定义为1。这使得所有的比较得到了很好的定义。

答案 2 :(得分:22)

根据C ++标准(5.9关系运算符)

  

2通常的算术转换是在操作数上执行的   算术或枚举类型。

  

1 ...结果的类型是bool。

和(3.9.1基本类型)

  

6 bool类型的值为true或false.49 [注意:没有   signed,unsigned,short或long bool类型或值。 - 尾注]    bool类型的值参与整体促销活动(4.5)。

和(4.5整体促销)

  

6 bool类型的prvalue可以转换为int类型的prvalue,    false变为零,真正成为

因此,在所有示例中,true转换为int 1,false转换为int 0

这些表达

false < false
false < true
true < false
true < true

完全等同于

0 < 0
0 < 1
1 < 0
1 < 1

答案 3 :(得分:8)

布尔false相当于int 0,布尔true相当于int 1。 这就解释了为什么表达式false < true =&gt; 0 < 1是唯一一个返回true的人。