C ++中bool值的所有可能值是什么?

时间:2013-09-24 14:50:38

标签: c++ c++11

问题并不像看起来那么明显,而且我很难在标准中找到有关bool类型的大量信息。

根据C ++ 11标准,与bool类型相关的保证有哪些:

  • 存储:需要多少空间,忽略对齐?是否要求存储用于表示truefalse
  • 的值
  • 取值:让b属于bool类型,断言(b == true) || (b == false)是否成立? (false < true)是否格式正确,是否成立?

5 个答案:

答案 0 :(得分:42)

bool类型在§3.9.1,基本类型一节中描述。与此相关的是第6段中的一句话:

  

bool类型的值为truefalse 47

参考脚注47提供了一些有趣的附加信息:

  

47 )以本标准描述的方式使用bool值作为“未定义”,例如通过检查未初始化的自动对象的值,可能会使其表现为如果既不是true也不是false

这只是标准对未定义行为的程序没有要求的直接后果。

bool没有大小要求,除了由于C ++内存模型而适用于所有类型的隐式“至少一个字节”。

bool个对象的内部表示也没有要求,但由于有关整数转换的要求(true必须转换为1false 0),实现可能倾向于为true1以及false0选择相同的表示形式,因为这样就不需要进行此类转换。

答案 1 :(得分:25)

  

存储:需要多少空间,忽略对齐?

实现定义,但实际上是一个字节。它通常不能更小,因为这是可能的最小对象大小。例外情况是:

  • 位域类成员可以是一个位;
  • std::vector<bool>打包值,以便每个值占一位;但实际上并不包含bool类型的对象。其他类型(如std::bitset)也做类似的事情,但不要假装存储bool
  

是否需要存储代表truefalse的值?

没有;只是要求当转换为数字类型时,true变为1而false变为0.实际上,这意味着实现可能会使用这些值;虽然,在某些平台上,其他表示可能会更好。

  

取得的值:让b成为bool类型的对象,断言(b == true) || (b == false)是否成立?

如果b已初始化或分配有效值,则断言将成立。如果它没有被初始化,那么它可能不会成立;但是如果使用未初始化的值,则无论如何都有未定义的行为。事实上,该标准包含一个特定的脚注(由C ++ 11 3.9.1 / 6引用)警告:

  

47)以本国际标准所描述的方式将bool值用作“未定义”,例如通过检查未初始化的自动对象的值,可能会使其表现为既不是真也不是假。

更新:问题不断增长:

  

(false < true)是否格式正确,是否成立?

是的,是的。操作数被提升为int,给出0 < 1,这是真的。

答案 2 :(得分:7)

关于bool的大小,如果我们从草案C ++标准中查看5.3.3 Sizeof 部分,它会说(强调我的) :

  

[...] sizeof(char),sizeof(signed char)和sizeof(unsigned char)是1.应用于任何其他基本类型(3.9.1)的sizeof的结果是实现定义的。 [注意:特别是, sizeof(bool),sizeof(char16_t),sizeof(char32_t)和sizeof(wchar_t)是实现定义的 74 -end note] [...]

以及关于bool的值,如果我们查看3.9.1 基本类型段落 6 说:

  

bool类型的值为true或false。 47

您还问:

  

取值:设b为bool类型的对象,断言(b == true)|| (b == false)持有?是(假的&lt; true)格式良好,是否成立?

部分4.5 整体促销在段落 6 中说明:

  

bool类型的prvalue可以转换为int类型的prvalue,false变为零,true变为1。

由于<的操作数被提升为int,因此假设(false < true)已正确初始化(您未调用未定义的行为),b成立)然后(b == true) || (b == false)也成立。

答案 3 :(得分:6)

有两种可能的值,truefalse

您可能观察到的任何其他内容都是未定义行为的结果。

答案 4 :(得分:0)

在正常使用情况下,作为bool转换的所有非零值数据都被解释为true,并且作为bool转换的数据的所有零值都是false。 bool必须至少为1个字节,因为C ++中的所有类型都必须遵守此质量。

但是我在这里得到了启发,而我上面的每个人都值得赞成。在未定义的行为场景(例如未初始化或格式错误的数据)中,bool可以同时为true和false。这种奇怪的行为,但又是什么未定义的总是很奇怪。谢谢大家的信息。

在评论中:this link到相关帖子。