操作“false <true”的定义良好吗?

C ++规范是否定义了:

  • 对于布尔参数是否存在“少于”运算符,如果是,
  • 4参数排列的结果?
  • 换句话说,规范定义了以下操作的结果吗?

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

    在我的设置(Centos 7,gcc 4.8.2)中,下面的代码吐出了我所期望的(给出C代表false的历史记录为0,true为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;
    }
    

    TL; DR:

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

    细节

    我们可以看到,通过阅读C ++标准草案5.9节的关系运算符(强调我的前进):

    操作数应该有算术 ,枚举或指针类型 ,或者输入std :: nullptr_t。 运算符<(小于),>(大于),<=(小于或等于)和> =(大于或等于)都会生成false或true。 结果的类型是bool

    而bools是3.9.1基本类型的类型

    类型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为零并且为真。

    所以表达式如下:

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

    使用这些规则变成:

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

    布尔值受制于通常的整数升级,其中false定义为0true定义为1 。 这使得所有的比较都得到了很好的定义。


    根据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类型的值可以转换为int类型的prvalue,其中false为零,true为真

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

    这些表达式

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

    完全等同于

    0 < 0
    0 < 1
    1 < 0
    1 < 1
    
    链接地址: http://www.djcxy.com/p/21147.html

    上一篇: Is the operation "false < true" well defined?

    下一篇: Why is sizeof(int) less than