dun*_*can 152 c++ boolean comparison-operators language-lawyer
C++规范是否定义:
换句话说,是否由规范定义的以下操作的结果?
false < false
false < true
true < false
true < true
Run Code Online (Sandbox Code Playgroud)
在我的设置(Centos 7,gcc 4.8.2)中,下面的代码吐出我期望的内容(假设C的历史表示false为0,true为1):
false < false = false
false < true = true
true < false = false
true < true = false
Run Code Online (Sandbox Code Playgroud)
虽然我很确定大多数(所有?)编译器会提供相同的输出,这是否由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;
}
Run Code Online (Sandbox Code Playgroud)
Sha*_*our 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
Run Code Online (Sandbox Code Playgroud)
回到部分5.9进一步查看关系运算符的机制,它说:
通常的算术转换是在算术或枚举类型的操作数上执行的.
在通常算术转换将在第5其中说:
否则,应对两个操作数执行整体促销(4.5)
部分4.5说:
bool类型的prvalue可以转换为int类型的prvalue,false变为零,true变为1.
所以表达式:
false < false
false < true
true < false
true < true
Run Code Online (Sandbox Code Playgroud)
使用这些规则成为:
0 < 0
0 < 1
1 < 0
1 < 1
Run Code Online (Sandbox Code Playgroud)
Mar*_*som 63
布尔值受常规整数提升的影响,false定义为0和true定义为1.这使得所有比较都得到了很好的定义.
Vla*_*cow 22
根据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
Run Code Online (Sandbox Code Playgroud)
完全等同于
0 < 0
0 < 1
1 < 0
1 < 1
Run Code Online (Sandbox Code Playgroud)