操作“false <true”的定义良好吗?
C ++规范是否定义了:
换句话说,规范定义了以下操作的结果吗?
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;
}
TL; DR:
这些操作根据C ++标准草案进行了很好的定义。
细节
我们可以看到,通过阅读C ++标准草案5.9
节的关系运算符(强调我的前进):
操作数应该有算术 ,枚举或指针类型 ,或者输入std :: nullptr_t。 运算符<(小于),>(大于),<=(小于或等于)和> =(大于或等于)都会生成false或true。 结果的类型是bool
而bools是3.9.1基本类型的类型
类型bool ,char,char16_t,char32_t,wchar_t以及有符号和无符号整数类型统称为整型。
和
积分类型和浮点类型统称为算术类型。
true
和false
是来自2.14.6
布尔文字的布尔文字:
boolean-literal:
false
true
回到5.9
节进一步了解关系运算符的机制,它说:
通常的算术转换是在算术或枚举类型的操作数上执行的。
第5
部分介绍了通常的算术转换:
否则,积分促销(4.5)应在两个操作数上执行
第4.5
节说:
一个bool类型的prvalue可以转换为int类型的prvalue,其中false为零并且为真。
所以表达式如下:
false < false
false < true
true < false
true < true
使用这些规则变成:
0 < 0
0 < 1
1 < 0
1 < 1
布尔值受制于通常的整数升级,其中false
定义为0
, true
定义为1
。 这使得所有的比较都得到了很好的定义。
根据C ++标准(5.9关系运算符)
2通常的算术转换是在算术或枚举类型的操作数上执行的。
和
1 ...结果的类型是bool。
和(3.9.1基本类型)
6 bool类型的值是true或false.49。[注意:没有signed,unsigned,short或long bool类型或值。 - 结束] bool类型的值参与积分促销 (4.5)。
和(4.5积分促销)
6 bool类型的值可以转换为int类型的prvalue,其中false为零,true为真 。
因此,在所有示例中,true都被转换为int 1,false被转换为int 0
这些表达式
false < false
false < true
true < false
true < true
完全等同于
0 < 0
0 < 1
1 < 0
1 < 1
链接地址: http://www.djcxy.com/p/21147.html