在c ++中,bool用于表示布尔值。这是真是假。但在某些情况下,我们也可以使用bool来表示整数。
c ++中bool a=5;
的含义是什么?
答案 0 :(得分:7)
“c ++中
bool a=5;
的含义是什么?”
这实际上相当于写作
bool a = (5 != 0);
“但在某些情况下,我们也可以使用bool来表示整数。”
不是真的。仅{em}的bool
值表示用于初始化它的整数是否为零( - > false
)或不是( - > true
)。
反过来(如@Daniel Frey's comment} false
中所述)将转换回整数0
,true
将变为1
。<登记/>
因此,原始整数值(或任何其他表达式结果如指针,nullptr
除外,或double
值不完全representing 0.0
)将丢失。
<强>结论强>
正如LRiO's answer中所述,无法将false
或true
以外的信息存储在bool
变量中。
虽然保留了转换规则(引自cppreference.com):
安全布尔问题
在C ++ 11中引入显式转换函数之前,设计一个应该在布尔上下文中可用的类(例如
if(obj) { ... }
)会产生一个问题:给定一个用户定义的转换函数,例如{{ 1}},隐式转换序列在该函数调用之后允许一个额外的标准转换序列,这意味着可以将得到的bool转换为int,允许使用T::operator bool() const;
或obj << 1;
等代码。可以在
int i = obj;
中看到一个早期解决方案,std::basic_ios
定义operator!
和operator void*
(直到C ++ 11),以便代码如if(std::cin) {...}
编译因为void*
可转换为bool
,但int n = std::cout;
无法编译,因为void*
无法转换为int
。这仍然允许删除诸如deletestd::cout;
之类的无意义代码,并且许多pre-C ++ 11第三方库都设计了更精细的解决方案,称为Safe Bool idiom。
答案 1 :(得分:3)
不,我们不能。
只是存在从整数到布尔值的隐式转换。
归零false
;其他任何东西都变成true
。
答案 2 :(得分:1)
实际上这个宣言
bool a=5;
相当于
bool a=true;
除了在第一个声明5中因为它不等于零而被隐式转换为true
。
来自C ++标准(4.12布尔转换)
1算术,无范围枚举,指针或指针的prvalue 成员类型可以转换为bool类型的prvalue。零 转换value,null指针值或null成员指针值 为假;任何其他值都转换为true。对于 直接初始化(8.5),类型为std :: nullptr_t的prvalue可以 转换为bool类型的prvalue;结果值为false。
另一个有趣的例子
bool a = new int;
当然,这并不意味着我们可以使用bool来表示指针。简单地说,如果分配成功,则返回的poimter不等于零,并根据我显示的引用隐式转换为true
。
考虑到目前为止一些编译器存在错误并成功编译此代码
bool a = nullptr;
虽然根据相同的引用,有效的声明看起来像
bool a( nullptr );
答案 3 :(得分:-1)
而且,基本上,我会认为bool b=5
“只是简单错误。”
C和C ++都有一个相对较弱的打字系统。不过,我认为这应该会产生编译错误......如果没有,肯定是被拒绝的代码审查,因为它是(恕我直言)更可能是一个无意的错误,而不是故意。
您应检查代码以确定b
是否“真的”被视为bool
值。除非有一些“神奇的用途”(C / C ++程序有时 被要求做...),这可能是一个错字或错误。
Vlad的回复(下图)显示标准所说的将会发生如果你这样做,但我建议,“因为它不会使人类 - 感觉这样做,这可能是一个错误,应该由团队相应地对待。
A“(类型)?”也许。像这样的数据类型不匹配? NYET。