bool
数据类型通常表示为0
(表示为false
)和1
(表示为true
)。但是,有人说true
值可以用1
以外的值表示。如果后面的语句是true
,则以下表达式可能不正确。
bool x = 1;
if (x==1)
Do something..
我想知道以下语句是否可以在常用的编译器上按期望和预期的方式工作。
bool x = 1;
if (x==1)
Do something.
bool y = 0;
if (y>0.5)
Do something..
bool z = 1;
if(z>0.5)
Do something...
答案 0 :(得分:12)
答案 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
将是promoted至int
,
类型
bool
可以转换为int
,其中值false
变成0
,而true
变成1
。
然后(x==1)
是true
。
对于第二种情况,if (y>0.5)
,y
将被提升为值int
的{{1}},然后是converted到0
comparison;
如果操作数具有算术或枚举类型(作用域或非作用域),则将按照算术运算符的规则对两个操作数执行常规的算术转换。转换后会比较这些值:
和
如果传递给算术运算符的操作数是整数或无作用域枚举类型,则在执行任何其他操作之前(但在从左值到右值转换之后,如果适用),该操作数将经历整数提升。
...
- 否则,如果其中一个操作数为
double
,则另一个操作数将转换为double
然后double
是y>0.5
。
对于第三种情况,false
,if (z>0.5)
将被提升为值z
的{{1}},然后是converted到int
comparison;那么1
是double
。
答案 2 :(得分:6)
if (x==1)
不正确。将布尔值转换为数字类型时,所有的真值表示形式都将转换为1。
给出bool z=true
,if(z>0.5)
将为true,因为1.0大于0.5。
答案 3 :(得分:4)
bool
只有两个值,分别是true
和false
。 1
和0
是整数文字,因此可以将它们转换为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
的主要用途是我们可以在代码中使用true
和false
,而不必给数字加上特殊的0
和1
含义。明确表示总是更好,因此当您指true
时,最好写true
而不是1
。
答案 4 :(得分:0)
这里的一个相关问题是“为什么我们甚至允许在 bool
和 int
之间进行比较?”。
答案是向后兼容和妥协,因为 C 和 C++ 曾经推荐整数来存储布尔值。所以有很多代码
其他语言在这方面可能更简洁,但 bool
类型显然是成功的。