我们都知道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;
答案 0 :(得分:4)
C ++是否仍然将运算符的返回值限制为1对0,或者从其中一个运算符执行'true',返回任何1字节值,只要它不是0?
比较运算符(假设它们没有被重载)只返回true
和false
。
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
有两个值:false
和true
。您可以将其视为整数,在这种情况下,false
将转换为0,true
将转换为1.这就是它的全部内容。
C样式的布尔值排序,其中0被视为false而非零被视为true,当有人天真地执行#define FALSE 0
和#define TRUE !FALSE
之类的操作时会导致问题。这有效地将TRUE
定义为1,而像if (f() == TRUE)
这样的比较可能会神秘地失败。正确的测试是if (f() != FALSE)
。当然,对于一个真正的布尔类型,这不是问题,因为非假的值将始终是相同的。