C - 使用 memset undefined 设置后读取 _Bool,是否定义了实现?

C - Is reading a _Bool after setting it with memset undefined, implementation defined?

提问人:Jesse 提问时间:3/18/2022 最后编辑:LundinJesse 更新时间:3/18/2022 访问量:147

问:

在 ISO 标准 C 中,我的理解是,没有什么可以真正确定_Bool的表示,但它确实说:

  • “_Bool 足够大,可以容纳值 0 和 1”
  • “当任何标量值转换为 _Bool 时,如果该值比较等于 0,则结果为 0; 否则,结果为 1”
  • “_Bool中的位数至少CHAR_BIT_Bool的宽度可以只有 1 位”

我当时在想(以及其他相关答案),false 的表示实际上不一定是 0(尽管在几乎所有实现中都是 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!");
}

c 布尔 语言-lawyer 实现-定义行为

评论

0赞 n. m. could be an AI 3/18/2022
C 中没有 true 和 false 值(stdbool.h 中有 true 和 false 宏,但您不必使用它们)。_Bool 是无符号整数类型。与任何算术类型一样,有一个零值,并且存在非零值,它们的行为类似于条件运算符中任何其他算术类型的值。
0赞 Adrian Mole 3/18/2022
在最后一个要点中,请参阅:什么是CHAR_BIT?
0赞 Lundin 3/18/2022
相关文章包含一些有趣的 UB 示例:_Bool类型和严格锯齿

答:

2赞 n. m. could be an AI 3/18/2022 #1

_Bool是无符号整数类型。它至少可以表示值 0 和 1。请注意,没有单独的 和 值。中的宏扩展为常数 1,宏扩展为常数 0 7.18。所以和 一样。truefalsetruestdbool.hfalsex == truex == 1

无符号整数类型中有两种位:值位和填充位 6.2.6.2p1。调用 将所有位(值和填充)设置为零。memset

对于任何整数类型,所有位均为零的对象表示形式应为该类型 6.2.6.2p5 中值零的表示形式。

因此,如图所示的程序片段没有可见的未定义、未指定或实现定义的行为。应打印合理完成的程序。zero is false