C++中是否规范地定义了:
- 布尔参数中的“小于(less than)运算符”,并且如果有的话,
- 四个参数排列的结果是什么?
换句话说,以下操作的结果是有准确定义的吗?
1
2
3
4
|
false < false
false < true
true < false
true < true
|
在我的设定下(Centos 7, GCC 4.8.2),下面的代码得出了我期望的结果(鉴于C用0表示false,用1表示true)
1
2
3
4
|
false < false = false
false < true = true
true < false = false
true < true = false
|
虽然我敢肯定,大多数(甚至所有?)编译器都会给出相同的输出,但这是由C++的标准规定的吗?或者这是一个模糊点,但符合规范的编译器可以算出true是小于false的?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
#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;
}
|
最佳回答来自 Shafik Yaghmour
该操作是根据C+ +标准明确界定的。
细节:
我们可以通过查找C++规范5.9节关系运算符的说明:
操作数必须有算数类型、枚举类型、或指针类型,又或是键入的std :: nullptr_t。该操作符<(小于),>(大于),<=(小于或等于),和> =(大于或等于)所有产生的结果均为false或true。结果为布尔型。
而布尔变量是在3.9.1基本类型中的算数类型。
类型为BOOL,CHAR,char16_t,char32_t,wchar_t的,和有符号、无符号整型统称为整型。
并且积分和浮点类型统称为算术类型。
此外,true和false是2.14.6布尔文字量中的布尔文字量:
1
2
3
|
boolean-literal:
false
true
|
回到5.9节来更深层地理解关系操作符的机制,它说:
通常的算数转化是在算数或枚举类型的操作数下执行的。
通常的算数转化在第五节中提及,它说:
否则整形提升(4.5)应该在两个操作数上执行,
并且4.5节提到:
bool类型的prvalue可转换为int类型的prvalue,这时false变为0,true变为1。
所以表达式:
1
2
3
4
|
false < false
false < true
true < false
true < true
|
通过这样的规则会变成:
1
2
3
4
|
0 < 0
0 < 1
1 < 0
1 < 1
|