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

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>
 
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 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值