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

rez*_*hsh 15 c++ implicit-conversion

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

bool x = 1;
if (x==1)
    Do something..
Run Code Online (Sandbox Code Playgroud)

我想知道以下语句是否可以在常用的编译器上按期望和预期的方式工作。

  1.  

    bool x = 1;
    if (x==1)
        Do something.
    
    Run Code Online (Sandbox Code Playgroud)
  2.  

    bool y = 0;
    if (y>0.5)
        Do something..
    
    Run Code Online (Sandbox Code Playgroud)
  3.  

    bool z = 1;
    if(z>0.5)
        Do something...
    
    Run Code Online (Sandbox Code Playgroud)

aki*_*han 13

C ++标准的第4.5节说:

bool类型的右值可以转换为int类型的右值,false变为零,true变为1。

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

  • @MSalters我知道这不是来自ISO 14882:2017的事实。 (5认同)
  • 这个报价从哪里来? (4认同)
  • 我怀疑它来自* C ++ 03标准*,但我没有方便检查的副本。 (3认同)
  • @Brian:C ++由ISO标准(14882)正式记录。因此,在Stack Overflow上,假定省略了源文档的引用都引用了_then-current_ C ++标准。由于这是2019年的答案,这意味着引用来自ISO 14882:2017(aka C ++ 17)。 (2认同)

son*_*yao 9

根据布尔转换的规则:

整数,浮点数,无作用域枚举,指针和指针成员类型的prvalue可以转换为type的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
Run Code Online (Sandbox Code Playgroud)

对于第一种情况下,if (x==1)x会被提拔int

该类型bool可以转换为intfalse成为?0?并true成为1

然后(x==1)true

对于第二种情况,if (y>0.5)y将被提升为int与值0,然后转换double用于比较 ;

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

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

...

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

然后y>0.5false

对于第三种情况,if (z>0.5)z将被提升为int与值1,然后转换double用于比较 ; 然后z>0.5true


eer*_*ika 6

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

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