使用Boolean表示整数

时间:2015-05-19 17:17:25

标签: c++ boolean

在c ++中,bool用于表示布尔值。这是真是假。但在某些情况下,我们也可以使用bool来表示整数。 c ++中bool a=5;的含义是什么?

4 个答案:

答案 0 :(得分:7)

  

“c ++中bool a=5;的含义是什么?”

这实际上相当于写作

bool a = (5 != 0);
  

“但在某些情况下,我们也可以使用bool来表示整数。”

不是真的。仅{em}的bool值表示用于初始化它的整数是否为零( - > false)或不是( - > true)。

反过来(如@Daniel Frey's comment} false中所述)将转换回整数0true将变为1。<登记/> 因此,原始整数值(或任何其他表达式结果如指针,nullptr除外,或double值不完全representing 0.0)将丢失。

<强>结论

正如LRiO's answer中所述,无法将falsetrue以外的信息存储在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。这仍然允许删除诸如delete std::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。