用布尔表示整数 在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…)“温和的读者”,真正的意图是什么。任何不一致的东西都可能是尚未发现的错误的前兆。