【发布时间】:2014-11-26 10:44:45
【问题描述】:
C++ 规范是否定义:
- 布尔参数是否存在“小于”运算符,如果存在,
- 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;
}
【问题讨论】:
-
@Ulterior 有有效的用途。比如在
std::vector<bool>上使用std::min作为&&。 -
@Ulterior 如果你能找出一个在 StackOverflow 这么多年之后还没有被问到的好问题,那么你值得加分。这不是拖钓。
-
@Ulterior 询问的动机是真实的:我对 C++(来自 C)相当陌生,并且想将一些对象存储在 std::set 中。我的对象
-
一个令人不安的结果是当
p和q是bool 类型时,p <= q表示p implies q! -
@Technophile 大概令人不安的是
<=可能会被无意中读作左箭头,并且“仅当”(即“[实质上] 暗示”)右箭头有时会被排版或非正式书写类似于=>(即,具有类似于=的双轴)。左箭头有时甚至被读作“如果”,尽管我相信这远不如右箭头用于“仅当”那么常见。
标签: c++ boolean language-lawyer comparison-operators