int main()
{
union {
struct {
char c[2];
char ch[2];
} s;
struct {
int i;
int j;
} st;
} u = { (12, 1), (15, 1) };
printf("%d %d ", u.st.i, u.st.j);
}
上面怎么打印“257 0”?
使用 {}
而不是 ()
有什么区别?
最佳答案
{}
表示初始化一个子对象。
()
是对表达式进行分组的运算符,例如(1+3)*2
。您混淆了使用逗号运算符,它丢弃其左侧操作数并返回右侧操作数。 (12,1)
与 1
相同。
初始化一个 union
总是设置它的第一个成员并忽略其他的。这是因为一次只有一个成员可以存储一个值。
用标量值初始化一个数组子对象,就像传递 1
来初始化 c[2]
一样,会自动跳转到数组中。这称为大括号省略。下一个 1
将初始化数组的第二个成员。
您将 1
分配给 c[2]
中的每个字符,然后将生成的字节字符串读回为小端 int
。数组 ch[2]
根本没有显式初始化;在 C++ 中它会被设置为零,但在 C 中我不完全确定。
初始化程序 { {12, 1}, {15, 1} }
不起作用,因为显然,大括号省略解释第一个 }
以关闭整个 union
。
初始化器 {{ {12, 1}, {15, 1} }}
会避免大括号省略并设置两个数组。 { 12, 1, 15, 1 }
应该做同样的事情。
请注意,标量值和字节字符串之间的转换是实现定义的;特别是它取决于字节顺序和 int
的大小。
关于c - union 内部的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13947728/