C++规范是否定义:
布尔参数的'小于'运算符的存在,如果存在,
4个参数排列的结果?
换句话说,是否由规范定义的以下操作的结果?
false < false false < true true < false true < true
在我的设置(Centos 7,gcc 4.8.2)中,下面的代码吐出我期望的内容(假设C的历史表示false为0,true为1):
false < false = false false < true = true true < false = false true < true = false
虽然我很确定大多数(所有?)编译器会提供相同的输出,这是否由C++规范立法?或者是一个混淆但符合规范的编译器允许判断true是否小于false?
#includeconst 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 Yaghm.. 206
TL; DR:
根据C++标准草案对操作进行了很好的定义.
细节
我们可以看到,通过草案C++标准部分5.9
关系运算符说(强调我的前进):
该操作数应具有算术,枚举,或指针类型,或键入的std :: nullptr_t.运算符<(小于),>(大于),<=(小于或等于)和> =(大于或等于)都会产生false或true.结果的类型是bool
和bool是3.9.1基本类型的arithematic类型
类型bool,char,char16_t,char32_t,wchar_t以及有符号和无符号整数类型统称 为整数类型.
和
积分和浮动类型统称为算术类型.
并true
与false
来自布尔文字2.14.6
布尔文字:
boolean-literal: false true
回到部分5.9
进一步查看关系运算符的机制,它说:
通常的算术转换是在算术或枚举类型的操作数上执行的.
在通常算术转换将在第5
其中说:
否则,应对两个操作数执行整体促销(4.5)
部分4.5
说:
bool类型的prvalue可以转换为int类型的prvalue,false变为零,true变为1.
所以表达式:
false < false false < true true < false true < true
使用这些规则成为:
0 < 0 0 < 1 1 < 0 1 < 1
很好,这与任何答案一样明确,但仍然易于阅读.尼克:我认为你加粗了错误的"类型":"**操作数应该有算术**,枚举或指针**类型**,或者输入std :: nullptr_t." 为清晰起见添加括号((算术,枚举或指针)类型)或(类型std :: nullptr_t). (6认同)
Mark Ransom.. 63
布尔值受常规整数提升的影响,false
定义为0
和true
定义为1
.这使得所有比较都得到了很好的定义.
TL; DR:
根据C++标准草案对操作进行了很好的定义.
细节
我们可以看到,通过草案C++标准部分5.9
关系运算符说(强调我的前进):
该操作数应具有算术,枚举,或指针类型,或键入的std :: nullptr_t.运算符<(小于),>(大于),<=(小于或等于)和> =(大于或等于)都会产生false或true.结果的类型是bool
和bool是3.9.1基本类型的arithematic类型
类型bool,char,char16_t,char32_t,wchar_t以及有符号和无符号整数类型统称 为整数类型.
和
积分和浮动类型统称为算术类型.
并true
与false
来自布尔文字2.14.6
布尔文字:
boolean-literal: false true
回到部分5.9
进一步查看关系运算符的机制,它说:
通常的算术转换是在算术或枚举类型的操作数上执行的.
在通常算术转换将在第5
其中说:
否则,应对两个操作数执行整体促销(4.5)
部分4.5
说:
bool类型的prvalue可以转换为int类型的prvalue,false变为零,true变为1.
所以表达式:
false < false false < true true < false true < true
使用这些规则成为:
0 < 0 0 < 1 1 < 0 1 < 1
Boolean false
等价于int 0
,而boolean true
等价于int 1
.所以这解释了为什么表达式false < true
=> 0 < 1
是唯一返回的true
.
根据C++标准(5.9关系运算符)
2通常的算术转换是在算术或枚举类型的操作数上执行的.
和
1 ...结果的类型是bool.
和(3.9.1基本类型)
6 bool类型的值为true或false.49 [注意:没有signed,unsigned,short或long bool类型或值.-end note] bool类型的值参与整体促销(4.5).
和(4.5整体促销)
6 bool类型的prvalue可以转换为int类型的prvalue,false变为零,true变为1.
因此,在所有示例中,true转换为int 1,false转换为int 0
这些表达
false < false false < true true < false true < true
完全等同于
0 < 0 0 < 1 1 < 0 1 < 1
布尔值受常规整数提升的影响,false
定义为0
和true
定义为1
.这使得所有比较都得到了很好的定义.