“ false < true”操作的定义是否明确?

C + + 规范是否定义:

  1. 布尔参数的小于运算符的存在,如果存在,
  2. 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 + + 规范规定的吗?或者是一个模糊的,但是符合规范的编译器允许判断真是小于假?

#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;
}
13019 次浏览

布尔值受通常整数提升的影响,false定义为 0true定义为 1。这使得所有的比较都有了明确的定义。

译者:

根据 C + + 标准草案对操作进行了很好的定义。

细节

我们可以看到,通过转到 C + + 标准草案部分 5.9 关系运算符,它说(强调我的未来) :

操作数必须有算术、枚举或指针 类型或类型 std: : nullptr _ t (小于) ,(大于) ,(小于或等于) ,和 > = (大于或等于)所有产量 假或真。结果的类型是 bool

和布尔是算术类型从3.9.1基本类型

类型 布尔、 char、 char16 _ t、 char32 _ t、 wchar _ t 以及有符号和无符号整数类型是统称的 叫做整型。

还有

整型和浮型统称为算术 类别。

以及 truefalse是来自 2.14.6的布尔文本:

boolean-literal:
false
true

返回到 5.9部分,进一步了解关系运算符的机制,它说:

通常的算术转换是在算术或枚举类型的操作数上执行的。

5章节涵盖了 通常的算术转换的内容,它说:

否则,整数提升(4.5)应在两个操作数上执行

4.5部分写道:

Bool 类型的 prvalue 可以转换为 int 类型的 prvalue,false 变为0和 true 合二为一。

所以表达方式是:

false < false
false < true
true < false
true < true

使用这些规则成为:

0 < 0
0 < 1
1 < 0
1 < 1

根据 C + + 标准(5.9个关系运算符)

2通常的算术转换是在 算术或枚举类型。

还有

结果的类型是 bool。

及(3.9.1基本类别)

6 bool 类型的值是 true 或 false。49[注意: 没有 有符号的、无符号的、短的或长的 bool 类型或值 类型 bool 的值参与整数促进 (4.5)。

及(4.5整体晋升)

6 bool 类型的 prvalue 可以转换为 int 类型的 prvalue, 与 假变成零,真变成一

所以在所有的例子中 true 被转换成 int 1 false 被转换成 int 0

这些表情

false < false
false < true
true < false
true < true

完全等同于

0 < 0
0 < 1
1 < 0
1 < 1

布尔 false等价于 int 0,布尔 true等价于 int 1。 这就解释了为什么表达式 false < true = > 0 < 1是唯一返回 true的表达式。