用布尔表示整数 在C++中,布尔是用来表示布尔的。也就是说,它是真是假。但在某些情况下,我们也可以使用bool来表示整数。 boola=5的含义是什么? BoOL A= 5的含义是什么?< C++中的代码>?< /P>

用布尔表示整数 在C++中,布尔是用来表示布尔的。也就是说,它是真是假。但在某些情况下,我们也可以使用bool来表示整数。 boola=5的含义是什么? BoOL A= 5的含义是什么?< C++中的代码>?< /P>,c++,boolean,C++,Boolean,这实际上相当于写作 bool a = (5 != 0); “但在某些情况下,我们也可以使用bool来表示整数。” 不是真的。bool值仅表示用于初始化它的整数是零(-code>false)还是非零(-code>true) 反过来(如中所述)false将转换回整数0,true将变为1 因此原始整数值(或除nullptr或double值以外的任何其他表达式结果,如指针)将丢失 结论 如中所述,除了在bool变量中存储false或true以外,不可能存储其他信息 但有保证的转换规则(引用自):

这实际上相当于写作

bool a = (5 != 0);
“但在某些情况下,我们也可以使用bool来表示整数。”

不是真的。
bool
值仅表示用于初始化它的整数是零(-code>false)还是非零(-code>true)


反过来(如中所述)
false
将转换回整数
0
true
将变为
1

因此原始整数值(或除
nullptr
double
值以外的任何其他表达式结果,如指针)将丢失


结论

如中所述,除了在
bool
变量中存储
false
true
以外,不可能存储其他信息

但有保证的转换规则(引用自):

安全布尔问题
在C++11中引入显式转换函数之前,设计一个在布尔上下文中应该可用的类(例如,
if(obj){…}
)存在一个问题:给定一个用户定义的转换函数,例如
T::operator bool()const
,隐式转换序列允许在该函数调用之后再添加一个标准转换序列,这意味着可以将结果bool转换为int,允许像
obj这样的代码实际上就是这个声明

bool a=5;
相当于

bool a=true;
除了在第一个声明中,5因为不等于零而隐式转换为
true

<> >从C++标准(4.12布尔转换)< /P> 1算术、非范围枚举、指针或指针的PR值 to成员类型可以转换为bool类型的prvalue。零 转换值、空指针值或空成员指针值 虚假;任何其他值都将转换为true。对于 直接初始化(8.5),可以使用std::nullptr_t类型的PR值 转换为bool类型的prvalue;结果值为false

还有一个有趣的例子

bool a = new int;
当然,这并不意味着我们可以使用bool来表示指针。简单地说,如果分配成功,则返回的poimter不等于零,并根据我显示的引号隐式转换为
true

考虑到目前为止一些编译器有一个bug,并成功地编译了这段代码

bool a = nullptr;
虽然根据同一引文,有效声明如下

bool a( nullptr );

不,我们不能。

只是有一个从整数到布尔的隐式转换


零变为假
;其他任何事情都变成了事实,基本上,我认为,
bool b=5
是“完全错误的”

<> P. C和C++均具有比较弱的打字系统。然而,我认为这应该产生一个编译错误。。。如果不是,那么肯定是被拒绝的代码评审,因为它(IMHO)更可能是无意的错误,而不是故意的错误

您应该检查代码以确定
b
是否“真正”被视为
bool
值。除了一些“神奇的比特旋转目的”(C/C++程序有时被调用来完成…),这可能是一个打字错误或bug

Vlad的回答(如下)显示了标准所说的如果你这样做会发生什么,但我建议,“因为这样做没有人情味,这可能是一个错误,应该由团队进行相应的处理


(打字)?“也许吧。像这样的数据类型不匹配?Nyet.

这应该是相关的:布尔值只包含两个值:
true
false
,至少由一位表示。要表示一个数字,您需要一个具有更多位的数据类型,因为您需要区分42、1、7、8等。对于最后一部分:
bool
值在转换为整数时表示
0
1
。基本上,我认为bool b=5“完全错了。”“为什么呢?这是完全正确的。因为,在我看来,程序员不太可能故意这样做:指定“Boolean”(即“yes或no”)变量等于“5”。因此,无论语言规范是否规定编译器接受它(它接受…),我都会假定它很可能代表“人为错误”在任何情况下,这都是一种无法直观理解/显而易见的结构。(“如果是‘布尔’,那么哪个是?真还是假?”)我会更改代码。我在生产代码中使用了这些东西(非常成功),例如,使用配置定义值实例化一定数量的组件,并检查是否有这些组件可用/启用。“Vlad的响应(下面)”不再在下面,你应该这样做。还有一点是,如果某个值为零或不为零,则该信息在程序中仍然有用,对于这种情况,不需要担心类型安全性。转换规则定义得很好。明白了。基本上,我的评论是“在生产代码中,东西很容易被忽略。”(而且,我们很大程度上依赖于我们所看到的,例如,在变量声明的数据类型中。取决于我们期望看到的。)如果“Bool”变量实际上不只包含“yes/no”,那么我希望看到“(typecasts)”更好地描述(总是,harried…)“温和的读者”,真正的意图是什么。任何不一致的东西都可能是尚未发现的错误的前兆。