比较运算符值C ++

时间:2012-10-26 21:34:52

标签: c++ c boolean operator-keyword

我们都知道C ++(虽然不是超集)几乎来自C。

在C ++中,运算符<,< =,>,> =,==和!= all都具有布尔返回值。 但是,在C中,相同的运算符返回1或0,因为C中没有'bool'类型。

由于除0以外的所有整数值都被视为“true”,而0是“false”,我想知道:

C ++是否仍然将运算符的返回值限制为1对0,或者从其中一个运算符执行'true',返回任何1字节值,只要它不是0?

我想知道,因为使用这些返回值作为显式1或0在没有分支的按位运算中会很有用。

作为一个可怕的例子,请采取以下措施:

bool timesTwo;
int value;

//...

if(timesTwo)
    value << 1;

//vs

value << (int) timesTwo;

3 个答案:

答案 0 :(得分:4)

  
    

C ++是否仍然将运算符的返回值限制为1对0,或者从其中一个运算符执行'true',返回任何1字节值,只要它不是0?

  

比较运算符(假设它们没有被重载)只返回truefalse

int(true)始终为1。

int(false)始终为0.

所以,

int one(1), two(2);
assert( (one<two) == 1 );
assert( (two<one) == 0 );

答案 1 :(得分:2)

实际上,bool在表达式中使用时会自动转换为C ++中的整数(如果为1则为1,如果为false则为0),并且不需要强制转换。

value << (int) timesTwo;

案件没有必要: 如果`timesTwo``为真,那么

你可以直接做一个没有casr:

value<<timesTwo;

相当于:

value<<1;

答案 2 :(得分:0)

类型bool有两个值:falsetrue。您可以将其视为整数,在这种情况下,false将转换为0,true将转换为1.这就是它的全部内容。

C样式的布尔值排序,其中0被视为false而非零被视为true,当有人天真地执行#define FALSE 0#define TRUE !FALSE之类的操作时会导致问题。这有效地将TRUE定义为1,而像if (f() == TRUE)这样的比较可能会神秘地失败。正确的测试是if (f() != FALSE)。当然,对于一个真正的布尔类型,这不是问题,因为非假的值将始终是相同的。