操作“false”是否真的被很好地定义?

C ++规范是如何定义的:

  1. 布尔参数的“小于”运算符的存在,如果是的话,
  2. 4个参数排列的结果?

换句话说,是由规范定义的以下操作的结果?

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

在我的设置(Centos 7,gcc 4.8.2)中,下面的代码吐出我所期望的(给出C代表false的历史logging为0,true为1):

 false < false = false false < true = true true < false = false true < true = false 

虽然我很确定大多数(所有?)编译器会给出相同的输出,这是由C ++规范立法吗? 或者是一个模糊的,但符合规范的编译器允许决定true是不是错误?

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

TL; DR:

这些操作根据C ++标准草案进行了很好的定义。

细节

我们可以看到,通过阅读C ++标准草案 5.9节的关系运算符强调我的前进 ):

操作数应该有算术 ,枚举或指针types ,或者inputstd :: nullptr_t。 运算符<(小于),>(大于),<=(小于或等于)和> =(大于或等于)都会生成false或true。 结果的types是bool

bools是3.9.1基本types中的一个types

typesbool ,char,char16_t,char32_t,wchar_t以及有符号和无符号整数types统称为整型。

积分types和浮点types统称为算术types。

truefalse是来自2.14.6布尔文字的布尔文字:

 boolean-literal: false true 

回到5.9节进一步看关系运算符的机制,它说:

通常的算术转换是在算术或枚举types的操作数上执行的。

5部分介绍了通常的算术转换

否则,整体促销(4.5)应在两个操作数上执行

4.5节说:

一个types为bool的prvalue可以被转换为inttypes的prvalue,其中false为零,true为真。

所以expression式:

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

使用这些规则变成:

 0 < 0 0 < 1 1 < 0 1 < 1 

布尔值受制于通常的整型促销,其中false定义为0true定义为1 。 这使得所有的比较都得到了很好的定义。

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

2通常的算术转换是在算术或枚举types的操作数上执行的。

1 …结果的types是bool。

和(3.9.1基本types)

6 booltypes的值是true或者false.49 [注意:没有signed,unsigned,short或long booltypes或值。 – 结束] booltypes的值参与积分促销 (4.5)。

和(4.5积分促销)

6一个booltypes的值可以被转换成一个inttypes的prvalue,其中false为零,true为真

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

这些expression式

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

完全等同于

 0 < 0 0 < 1 1 < 0 1 < 1 

布尔值false等同于int 0 ,布尔值true等同于int 1 。 所以这解释了为什么expression式false < true => 0 < 1是唯一返回true的expression式。