我正在学习K&R C.在第6.8章中,它指出:
联合只能使用其第一个成员的类型值进行初始化; 因此,
u上述联合只能用整数值初始化.
...并定义一个联合u如下:
union u_tag {
int ival;
float fval;
char *sval;
} u;
Run Code Online (Sandbox Code Playgroud)
我不知道怎么理解这个.这是什么意思,初始化u必须如下:
u.ival = 323;
Run Code Online (Sandbox Code Playgroud)
很明显,情况并非如此,因为我可以初衷u为:
u.fval = 1.0;
Run Code Online (Sandbox Code Playgroud)
要么
u.sval = "hi";
Run Code Online (Sandbox Code Playgroud)
里奇是什么意思?
发布的代码正在执行分配,而不是初始化.作者意味着以下是有效的初始化,因为323是int和第一个成员u_tag是int:
union u_tag u = { 323 }; /* Initializes u.ival. */
Run Code Online (Sandbox Code Playgroud)
以下是无效的,因为它会试图初始化一个int具有char[]:
union u_tag u = { "hi" };
Run Code Online (Sandbox Code Playgroud)
但是,由于C99不再是这种情况.在C99中,引入了指示符:
union u_tag u = { .sval = "hi" };
Run Code Online (Sandbox Code Playgroud)
在C89中,如果您想要union使用除第一个成员以外的成员的值初始化a,则可以复制现有成员union.如果你想声明unionas,这将特别有用const.例如:
union u_tag make_u_tag_with_fval(const float a_fval)
{
union u_tag u;
u.fval = a_fval;
return u;
}
const union u_tag u_fval = make_u_tag_with_fval(1.0);
Run Code Online (Sandbox Code Playgroud)