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

这个问题看起来并不那么明显,而且在标准中找不到有关booltypes的更多信息。

根据C ++ 11标准,关于booltypes的相关保证是什么:

  • 存储:需要多less空间,忽略alignment? 是否有任何要存储的值来表示false
  • 采取的值:让bbooltypes,断言(b == true) || (b == false) (b == true) || (b == false)持有? (false < true)是否形成良好,是否成立?

booltypes在§3.9.1,基本types中有描述。 这里相关的是第6段的一句话:

typesbooltruefalse47

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

按照本国际标准描述的方式使用bool值作为“未定义的”,比如通过检查一个未初始化的自动对象的值,可能会导致它看起来既不true也不true

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

对于bool没有大小要求,除了作为C ++内存模型的结果适用于所有types的隐式“至less一个字节”之外。

bool对象的内部表示也没有要求,但是由于对整数转换的要求( true必须转换为1false0 ),实现可能会倾向于select相同的表示true1false0 ,因为这使得这种转换是不必要的。

存储:需要多less空间,忽略alignment?

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

  • bitfield类成员可以是一个单一的位;
  • std::vector<bool>打包值,以便每个都占用一个位; 但并不真正拥有booltypes的对象。 其他types(如std::bitset )做类似的事情,但不要假装存储bool

是否有任何要存储的值来表示false

没有; 只是当转换为数字types时, true变为1, false变为0.在实践中,这意味着实现可能使用这些值; 尽pipe在某些平台上,其他表示可能会更好。

采取的值:让b是一个booltypes的对象,断言(b == true) || (b == false) (b == true) || (b == false)持有?

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

按照本国际标准描述的方式使用bool值作为“未定义的”,比如通过检查一个未初始化的自动对象的值,可能会导致它看起来既不正确也不正确。

更新:问题不断增长:

(false < true)是否形成良好,是否成立?

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

关于bool的大小,如果我们看一下C ++标准草案中的5.3.3节的大小(这里强调我的 ):

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

关于bool的值,如果我们看第3.9.1节的基本types,6段说:

booltypes的值是真或假。 47

你还问:

采取的值:让b是一个booltypes的对象,断言(b == true)|| (b ==假)持有? (假的<true)是否形成良好,是否成立?

4.5整体促销说:

一个types为bool的prvalue可以被转换为inttypes的prvalue,其中false为零,true为真。

由于操作数<被提升为int所以(false < true)保持b被正确初始化( 你不调用未定义的行为 ),那么(b == true) || (b == false) (b == true) || (b == false)也成立。

有两个可能的值, false

你可能观察到的任何事情都是未定义行为的结果。

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

但是我在这里已经开悟了,在我之上的每个人都值得高兴。 在未定义的行为场景(如未初始化或格式不正确的数据)中,bool可以同时为true和false。 这种奇怪的行为,但是然后又是什么不明确总是奇怪。 感谢大家的信息。

在评论中: 这个链接到一个相关的职位。