提问人:Jesse 提问时间:3/18/2022 最后编辑:LundinJesse 更新时间:3/18/2022 访问量:147
C - 使用 memset undefined 设置后读取 _Bool,是否定义了实现?
C - Is reading a _Bool after setting it with memset undefined, implementation defined?
问:
在 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!");
}
答:
2赞
n. m. could be an AI
3/18/2022
#1
_Bool
是无符号整数类型。它至少可以表示值 0 和 1。请注意,没有单独的 和 值。中的宏扩展为常数 1,宏扩展为常数 0 7.18。所以和 一样。true
false
true
stdbool.h
false
x == true
x == 1
无符号整数类型中有两种位:值位和填充位 6.2.6.2p1。调用 将所有位(值和填充)设置为零。memset
对于任何整数类型,所有位均为零的对象表示形式应为该类型 6.2.6.2p5 中值零的表示形式。
因此,如图所示的程序片段没有可见的未定义、未指定或实现定义的行为。应打印合理完成的程序。zero is false
评论