比较C 中BOOL数据类型的比较

Comparison of bool data types in C++

本文关键字:比较 数据类型 BOOL      更新时间:2023-10-16

bool数据类型通常表示为0(AS false(和1(AS true(。但是,有人说true值可以由1以外的其他值表示。如果以后的语句为 true,则以下表达式可能不正确。

bool x = 1;
if (x==1)
    Do something..

我想知道以下陈述是否会根据需要和预期在常用编译器上工作。

  1.  

    bool x = 1;
    if (x==1)
        Do something.
    
  2.  

    bool y = 0;
    if (y>0.5)
        Do something..
    
  3.  

    bool z = 1;
    if(z>0.5)
        Do something...
    

§§4.5标准说:

类型布尔的rvalue可以是 转换为int类型的rvalue, 错误变为零和真实 成为一个。

关于2和3,类型转换进行,因此陈述将根据需要工作

根据布尔转换规则:

积分,浮点,未指挥,指针的序幕 指针到成员类型可以转换为类型的贵族 bool

值零(用于积分,浮点和未刻录 枚举(和空指针和零指针到成员 值成为false。所有其他值成为true

然后

bool x = 1; // x will be true
bool y = 0; // y will be false
bool z = 1; // z will be true

对于第一种情况,if (x==1)x将晋升为int

bool类型可以转换为int,而值false成为0,并且true成为1

然后(x==1)true

对于第二种情况,if (y>0.5)y将升级为具有值0int,然后转换为double进行比较;

如果操作数具有算术或枚举类型(范围或未指示(,则按照算术运算符的规则,对两个操作数进行了通常的算术转换。转换后比较值:

如果操作数传递给算术运算符是积分或无名的枚举类型,则在其他任何动作之前(但是在lvalue to-rvalue转换之后(如果适用(之后(,则操作数会进行积分促销。

...

  • 否则,如果任何操作数是double,则将其他操作数转换为double

然后y>0.5false

对于第三种情况,if (z>0.5)z将升级为具有值1int,然后转换为double进行比较;然后z>0.5true

if (x==1)不正确。当您将布尔值转换为数字类型时,所有真实值表示。

给定的bool z=trueif(z>0.5)是正确的,因为1.0大于0.5。

bool只有两个值,它们是 truefalse10是整数文字,因此可以将其转换为bool。您必须考虑转换在两个方向上都起作用,但您不一定会恢复相同的整数:

int a = 5;
bool b = a; // int -> bool conversion
int c = b;  // bool -> int conversion
std::cout << a << " " c;

打印:

5 1

0以外的任何整数值都将转换为true,但是true始终转换为1

牢记这一点,您的所有示例都将按预期工作。但是,请注意,bool的主要目的是我们可以在代码中使用truefalse,而不必将数字作为01特殊含义。要明确总是更好,因此,当您指的是true时,最好写true而不是1

这里的一个相关问题是"为什么我们甚至允许在boolint

之间进行比较。

答案是向后的兼容性和妥协,因为C和C 用于建议整数存储布尔值。因此,有很多代码

  1. 尽管有新的语言规则,也应继续工作关系运营商返回bool而不是int。
  2. 允许您通过更改布尔变量的声明来升级旧代码其余代码的其余部分进行最小的后续更改。

其他语言在这方面可能更干净,但是bool的类型显然是成功的。