操作"假<true"是否定义明确?

dun*_*can 152 c++ boolean comparison-operators language-lawyer

C++规范是否定义:

  1. 布尔参数的'小于'运算符的存在,如果存在,
  2. 4个参数排列的结果?

换句话说,是否由规范定义的以下操作的结果?

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以及有符号和无符号整数类型统称 为整数类型.

积分和浮动类型统称为算术类型.

truefalse来自布尔文字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)

  • 很好,这与任何答案一样明确,但仍然易于阅读.尼克:我认为你加粗了错误的"类型":"**操作数应该有算术**,枚举或指针**类型**,或者输入std :: nullptr_t." 为清晰起见添加括号((算术,枚举或指针)类型)或(类型std :: nullptr_t). (6认同)

Mar*_*som 63

布尔值受常规整数提升的影响,false定义为0true定义为1.这使得所有比较都得到了很好的定义.

  • 我喜欢这个答案比Shafik更短,但我认为`false`定义为'0`和`true`的关键点在标准*中定义为`1`*(而不仅仅是通常的做法)需求证据支持它. (5认同)
  • ...和关系运算符被指定在算术或枚举类型的操作数上执行通常的算术转换(包括整数提升). (2认同)

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)


小智 8

Boolean false等价于int 0,而boolean true等价于int 1.所以这解释了为什么表达式false < true=> 0 < 1是唯一返回的true.