操作“false”是否真的被很好地定义?
C ++规范是如何定义的:
- 布尔参数的“小于”运算符的存在,如果是的话,
- 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。
true
和false
是来自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
定义为0
, true
定义为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式。