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

 其穗茹 发布于 2022-12-18 18:42

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 

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

Shafik Yaghm.. 206

TL; DR:

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

细节

我们可以看到,通过草案C++标准部分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

很好,这与任何答案一样明确,但仍然易于阅读.尼克:我认为你加粗了错误的"类型":"**操作数应该有算术**,枚举或指针**类型**,或者输入std :: nullptr_t." 为清晰起见添加括号((算术,枚举或指针)类型)或(类型std :: nullptr_t). (6认同)


Mark Ransom.. 63

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

4 个回答
  • TL; DR:

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

    细节

    我们可以看到,通过草案C++标准部分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
    

    2022-12-18 18:45 回答
  • Boolean false等价于int 0,而boolean true等价于int 1.所以这解释了为什么表达式false < true=> 0 < 1是唯一返回的true.

    2022-12-18 18:45 回答
  • 根据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
    

    2022-12-18 18:46 回答
  • 布尔值受常规整数提升的影响,false定义为0true定义为1.这使得所有比较都得到了很好的定义.

    2022-12-18 18:46 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有