C++程序员看过来,false < false的设定恰当吗?

本文摘编自 StackOverflow 上的一个热门问答贴,duncan 提问:

C++中是否规范地定义了:

  1. 布尔参数中的“小于(less than)运算符”,并且如果有的话,
  2. 四个参数排列的结果是什么?

换句话说,以下操作的结果是有准确定义的吗?

在我的设定下(Centos 7, GCC 4.8.2),下面的代码得出了我期望的结果(鉴于C用0表示false,用1表示true)

虽然我敢肯定,大多数(甚至所有?)编译器都会给出相同的输出,但这是由C++的标准规定的吗?或者这是一个模糊点,但符合规范的编译器可以算出true是小于false的?

最佳回答来自 Shafik Yaghmour

该操作是根据C+ +标准明确界定的。

细节:

我们可以通过查找C++规范5.9节关系运算符的说明:

操作数必须有算数类型、枚举类型、或指针类型,又或是键入的std :: nullptr_t。该操作符<(小于),>(大于),<=(小于或等于),和> =(大于或等于)所有产生的结果均为false或true。结果为布尔型。

而布尔变量是在3.9.1基本类型中的算数类型。

类型为BOOL,CHAR,char16_t,char32_t,wchar_t的,和有符号、无符号整型统称为整型。

并且整数和浮点类型统称为算术类型。

此外,true和false是2.14.6布尔文字量中的布尔文字量:

回到5.9节来更深层地理解关系操作符的机制,它说:

通常的算数转化是在算数或枚举类型的操作数下执行的。

通常的算数转化在第五节中提及,它说:

否则整形提升(4.5)应该在两个操作数上执行,

并且4.5节提到:

bool类型的prvalue可转换为int类型的prvalue,这时false变为0,true变为1。

所以表达式:

通过这样的规则会变成:

收藏 2 评论

关于作者:sapphire

新浪微博:@纳米小可 个人主页 · 我的文章 · 10

相关文章

可能感兴趣的话题



直接登录
最新评论
  • 好无聊。0是false,1是true,这是每一个学C或者C++的人都需要也都应该知道的事实吧。

  • WUTIANTONG   2015/02/25

    ——并且积分和浮点类型统称为算术类型。
    “积分”是翻译错误。
    原文“Integral and floating types are collectively called arithmetic types.”
    Intergral明显是指“整数的”。

跳到底部
返回顶部