首页 文章

操作“假<true”是否定义明确?

提问于
浏览
151

C规范是否定义:

  • 对于布尔参数是否存在'less than'运算符,如果是,

  • 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;
}

4 回答

  • 8

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

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

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

    和(3.9.1基本类型)

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

    和(4.5整体促销)

    6 bool类型的prvalue可以转换为int类型的prvalue,false变为零,true变为1 .

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

    这些表达

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

    完全等同于

    0 < 0
    0 < 1
    1 < 0
    1 < 1
    
  • 63

    布尔 false 等效于 int 0 ,布尔 true 等效于 int 1 . 所以这解释了为什么表达式 false < true => 0 < 1 是唯一一个返回 true 的表达式 .

  • 203

    TL;DR:

    根据C标准草案对操作进行了明确的定义 .

    Details

    我们可以看到,通过draft C++ standard部分 5.9 关系运营商说(强调我的前进):

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

    和bool是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变为1 .

    所以表达式:

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

    使用这些规则成为:

    0 < 0
    0 < 1
    1 < 0
    1 < 1
    
  • 22

    布尔值受常规整数提升的影响, false 定义为 0true 定义为 1 . 这使得所有比较都得到了很好的定义 .

相关问题