C ++中bool值的所有可能值是什么?
这个问题看起来并不那么明显,而且在标准中找不到有关bool
types的更多信息。
根据C ++ 11标准,关于bool
types的相关保证是什么:
- 存储:需要多less空间,忽略alignment? 是否有任何要存储的值来表示
false
? - 采取的值:让
b
为bool
types,断言(b == true) || (b == false)
(b == true) || (b == false)
持有?(false < true)
是否形成良好,是否成立?
bool
types在§3.9.1,基本types中有描述。 这里相关的是第6段的一句话:
types
bool
是true
或false
。 47
参考脚注47提供了一些有趣的附加信息:
按照本国际标准描述的方式使用
bool
值作为“未定义的”,比如通过检查一个未初始化的自动对象的值,可能会导致它看起来既不true
也不true
。
这只是标准对没有定义行为的程序没有要求的直接结果。
对于bool
没有大小要求,除了作为C ++内存模型的结果适用于所有types的隐式“至less一个字节”之外。
对bool
对象的内部表示也没有要求,但是由于对整数转换的要求( true
必须转换为1
, false
为0
),实现可能会倾向于select相同的表示true
和1
, false
和0
,因为这使得这种转换是不必要的。
存储:需要多less空间,忽略alignment?
实现定义,但实际上是一个字节。 它通常不会更小,因为这是最小的可能的对象大小。 例外是:
- bitfield类成员可以是一个单一的位;
-
std::vector<bool>
打包值,以便每个都占用一个位; 但并不真正拥有bool
types的对象。 其他types(如std::bitset
)做类似的事情,但不要假装存储bool
。
是否有任何要存储的值来表示
false
?
没有; 只是当转换为数字types时, true
变为1, false
变为0.在实践中,这意味着实现可能使用这些值; 尽pipe在某些平台上,其他表示可能会更好。
采取的值:让
b
是一个bool
types的对象,断言(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。 这种奇怪的行为,但是然后又是什么不明确总是奇怪。 感谢大家的信息。
在评论中: 这个链接到一个相关的职位。