在ISO标准C中,我的理解是没有什么能真正确定_Bool的表示,但它确实说明:
- "_Bool足够大以保持值0和1〃
- "当任何标量值转换为_Bool时,如果该值比较等于0,则结果为0;否则结果为1〃
- "池中的比特数至少为CHAR_ BIT
我当时在想(以及从其他相关答案来看(,false的表示实际上不需要是0(尽管在几乎所有的实现中都是(。那么,如果您将_Bool成员设置为0,然后以某种方式使用它,会发生什么呢?这是未定义的行为(默认情况下,因为标准中没有定义(还是实现定义的行为?这似乎很重要(在我的理解中(,因为在前一种情况下,它不是一个定义良好的C程序,在后一种情况中,它是。例如,这是一个未定义的行为吗?false可以有0以外的表示形式吗?
#include <stdbool.h>
//...
bool x = true;
memset(&x, 0, sizeof(bool));
if(x == true)
{
printf("Zero is true!");
}
else
{
printf("zero is false!");
}
_Bool
是一个无符号整数类型。它至少可以表示值0和1。请注意,没有单独的true
和false
值。stdbool.h
中的宏true
扩展为常数1,宏false
扩展为常数0 7.18。所以x == true
和x == 1
是一样的。
无符号整数类型中有两种类型的位:值位和填充位6.2.6.2p1。您对memset
的调用将所有位(值和填充(设置为零。
对于任何整数类型,所有位都为零的对象表示应为该类型6.2.6.2p5中值零的表示。
因此,所示的程序片段没有可见的未定义、未指定或实现定义的行为。合理完成的程序应打印zero is false
。