C规范是否定义:
-
对于布尔参数是否存在'less than'运算符,如果是,
-
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规范规定?或者是一个混淆但符合规范的编译器允许判断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;
}
4 回答
根据C标准(5.9关系运算符)
和
和(3.9.1基本类型)
和(4.5整体促销)
因此,在所有示例中,true转换为int 1,false转换为int 0
这些表达
完全等同于
布尔
false
等效于int 0
,布尔true
等效于int 1
. 所以这解释了为什么表达式false < true
=>0 < 1
是唯一一个返回true
的表达式 .TL;DR:
根据C标准草案对操作进行了明确的定义 .
Details
我们可以看到,通过draft C++ standard部分
5.9
关系运营商说(强调我的前进):和bool是3.9.1基本类型的arithematic类型
和
和
true
和false
是来自2.14.6
布尔文字的布尔文字:回到
5.9
部分进一步查看关系运算符的机制,它说:5
部分介绍了通常的算术转换,其中说:和
4.5
部分说:所以表达式:
使用这些规则成为:
布尔值受常规整数提升的影响,
false
定义为0
,true
定义为1
. 这使得所有比较都得到了很好的定义 .