问题并不像看起来那么明显,而且我很难在标准中找到有关bool
类型的大量信息。
根据C ++ 11标准,与bool
类型相关的保证有哪些:
true
和false
?b
属于bool
类型,断言(b == true) || (b == false)
是否成立? (false < true)
是否格式正确,是否成立?答案 0 :(得分:42)
bool
类型在§3.9.1,基本类型一节中描述。与此相关的是第6段中的一句话:
bool
类型的值为true
或false
。 47
参考脚注47提供了一些有趣的附加信息:
47 )以本标准描述的方式使用
bool
值作为“未定义”,例如通过检查未初始化的自动对象的值,可能会使其表现为如果既不是true
也不是false
。
这只是标准对未定义行为的程序没有要求的直接后果。
bool
没有大小要求,除了由于C ++内存模型而适用于所有类型的隐式“至少一个字节”。
对bool
个对象的内部表示也没有要求,但由于有关整数转换的要求(true
必须转换为1
和false
0
),实现可能倾向于为true
和1
以及false
和0
选择相同的表示形式,因为这样就不需要进行此类转换。
答案 1 :(得分:25)
存储:需要多少空间,忽略对齐?
实现定义,但实际上是一个字节。它通常不能更小,因为这是可能的最小对象大小。例外情况是:
std::vector<bool>
打包值,以便每个值占一位;但实际上并不包含bool
类型的对象。其他类型(如std::bitset
)也做类似的事情,但不要假装存储bool
。是否需要存储代表
true
和false
的值?
没有;只是要求当转换为数字类型时,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)
有两种可能的值,true
和false
。
您可能观察到的任何其他内容都是未定义行为的结果。
答案 4 :(得分:0)
在正常使用情况下,作为bool转换的所有非零值数据都被解释为true,并且作为bool转换的数据的所有零值都是false。 bool必须至少为1个字节,因为C ++中的所有类型都必须遵守此质量。
但是我在这里得到了启发,而我上面的每个人都值得赞成。在未定义的行为场景(例如未初始化或格式错误的数据)中,bool可以同时为true和false。这种奇怪的行为,但又是什么未定义的总是很奇怪。谢谢大家的信息。
在评论中:this link到相关帖子。