#include <stdio.h>
struct temp{
unsigned int zero_bit : 1;
unsigned int first_bit : 1;
} ;
// struct temp_1{
// unsigned int zero_bit : 0;
// unsigned int first_bit : 0;
// } ; // Code fails
int main() {
struct temp a1;
printf("%d", a1.zero_bit); // returns 0
return 0;
}
为什么 temp1 结构会失败,而 temp 结构却不会,考虑到它们都初始化为 0。
为什么编译器给我错误的希望,即 Zero_bit 已初始化为 1,而实际上它已初始化为 0 值?
:
后面的数字不是初始化值,而是位域的宽度(以位为单位)。
来自上面的文档链接:
宽度-
值大于或等于的整数常量表达式 为零且小于或等于基础类型中的位数。 当大于零时,这是该位字段的位数 会占据。 零值仅适用于无名位域 并且具有特殊含义:它指定了下一个位字段 类定义将从分配单元的边界开始。
(重点是我的)
在
struct temp
中,1
的宽度有效,但在 struct temp_1
中,0
的宽度无效(它不属于上述无名位字段的例外)。struct temp_1
编译错误的原因。
另一个问题是:
struct temp a1;
printf("%d", a1.zero_bit); // returns 0
a1
未初始化,因此包含不确定的值。您看到的 0
的值只是偶然的。