C ++规范是否定义:
换句话说,是由规范定义的以下操作的结果吗?
false < false
false < true
true < false
true < true
在我的设置(Centos 7,gcc 4.8.2)中,下面的代码吐出了我所期望的内容(假设C&C表示假为0且真为1的历史记录):
false < false = false
false < true = true
true < false = false
true < true = false
虽然我非常确定大多数(所有?)编译器会提供相同的输出,这是否由C ++规范立法?或者是一个混淆但符合规范的编译器,允许判断true是否小于false?
#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;
}
答案 0 :(得分:206)
TL; DR:
根据C ++标准草案对操作进行了很好的定义。
详细
我们可以通过转到draft C++ standard部分5.9
关系运算符来看到(强调我的前进):
操作数应具有算术,枚举或指针类型,或键入std :: nullptr_t。运营商 &LT; (小于),&gt; (大于),&lt; =(小于或等于),&gt; =(大于或等于)所有产量 虚假或真实。结果的类型是bool
和bools是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 成为一个。
所以表达式:
false < false
false < true
true < false
true < true
使用这些规则成为:
0 < 0
0 < 1
1 < 0
1 < 1
答案 1 :(得分:63)
布尔值受常规整数促销的约束,false
定义为0
,true
定义为1
。这使得所有的比较得到了很好的定义。
答案 2 :(得分:22)
根据C ++标准(5.9关系运算符)
2通常的算术转换是在操作数上执行的 算术或枚举类型。
和
1 ...结果的类型是bool。
和(3.9.1基本类型)
6 bool类型的值为true或false.49 [注意:没有 signed,unsigned,short或long bool类型或值。 - 尾注] bool类型的值参与整体促销活动(4.5)。
和(4.5整体促销)
6 bool类型的prvalue可以转换为int类型的prvalue, false变为零,真正成为。
因此,在所有示例中,true转换为int 1,false转换为int 0
这些表达
false < false
false < true
true < false
true < true
完全等同于
0 < 0
0 < 1
1 < 0
1 < 1
答案 3 :(得分:8)
布尔false
相当于int 0
,布尔true
相当于int 1
。
这就解释了为什么表达式false < true
=&gt; 0 < 1
是唯一一个返回true
的人。