C ++中布尔数据类型的比较

时间:2019-05-20 09:42:14

标签: c++ implicit-conversion

bool数据类型通常表示为0(表示为false)和1(表示为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...
    

5 个答案:

答案 0 :(得分:12)

C++ standard

§4.5说:

  

布尔类型的右值可以是   转换为int类型的右值,   假变成零和真   成为一个。

关于2和3,发生类型转换,因此语句将按需工作

答案 1 :(得分:9)

根据Boolean conversions的规则:

  

整数,浮点数,无作用域枚举,指针,   指针类型和成员类型可以转换为类型的prvalue   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将是promotedint

  

类型bool可以转换为int,其中值false变成0,而true变成1

然后(x==1)true

对于第二种情况,if (y>0.5)y将被提升为值int的{​​{1}},然后是converted0 comparison;

  

如果操作数具有算术或枚举类型(作用域或非作用域),则将按照算术运算符的规则对两个操作数执行常规的算术转换。转换后会比较这些值:

  

如果传递给算术运算符的操作数是整数或无作用域枚举类型,则在执行任何其他操作之前(但在从左值到右值转换之后,如果适用),该操作数将经历整数提升。

     

...

     
      
  • 否则,如果其中一个操作数为double,则另一个操作数将转换为double
  •   

然后doubley>0.5

对于第三种情况,falseif (z>0.5)将被提升为值z的{​​{1}},然后是convertedint comparison;那么1double

答案 2 :(得分:6)

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

给出bool z=trueif(z>0.5)将为true,因为1.0大于0.5。

答案 3 :(得分:4)

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

答案 4 :(得分:0)

这里的一个相关问题是“为什么我们甚至允许在 boolint 之间进行比较?”。

答案是向后兼容和妥协,因为 C 和 C++ 曾经推荐整数来存储布尔值。所以有很多代码

  1. 尽管有新的语言规则,但仍应继续工作,例如 关系运算符返回 bool 而不是 int。
  2. 允许您通过更改布尔变量的声明来升级旧代码 对其余代码进行最少的后续更改。

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