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

来源:互联网 发布:数据库关联查询 编辑:程序博客网 时间:2024/05/15 11:17

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

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

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

1
2
3
4
false < false
false < true
true < false
true < true

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

1
2
3
4
false < false = false
false < true = true
true < false = false
true < true = false

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
constchar * s(boola)
{
  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);
  return0;
}

最佳回答来自 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布尔文字量中的布尔文字量:

1
2
3
boolean-literal:
    false
    true

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

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

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

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

并且4.5节提到:

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

所以表达式:

1
2
3
4
false < false
false < true
true < false
true < true

通过这样的规则会变成:

1
2
3
4
0 < 0
0 < 1
1 < 0
1 < 1
0 0