Pot*_*ter 14
{} 表示初始化子对象.
()是一个对表达式进行分组的运算符,例如(1+3)*2.您混淆地使用了逗号运算符,该运算符丢弃其左侧操作数并返回右侧操作数.(12,1)是一样的1.
初始化a union始终设置其第一个成员并忽略其他成员.这是因为一次只能有一个成员存储值.
在传递1初始化时c[2],使用标量值初始化数组子对象会自动跳转到数组中.这称为支撑elision.接下来1将初始化数组的第二个成员.
您分配1给每个字符c[2],然后将结果字节字符串作为little-endian读回int.该阵列ch[2]根本没有明确初始化; 在C++中,它将设置为零,但我不完全确定在C.
初始化程序{ {12, 1}, {15, 1} }不起作用,因为显然,括号elision解释了第一个}关闭整个union.
初始化程序{{ {12, 1}, {15, 1} }}将避免括号缩写并设置两个数组.{ 12, 1, 15, 1 }应该这样做.
请注意,标量值和字节字符串之间的转换是实现定义的; 特别是它取决于字节顺序和大小int.
和(12, 1)都(15, 1)简化为(奇怪的是)1。这是因为,正如 Omkant 所说,您使用的是逗号运算符,它执行它所除的每个表达式,但返回最终表达式的值。维基百科条目实际上很好地解释了这一点。
结果,u.s.c[0]第一个 1 被填充,u.s.c[1]第二个 1 被填充。由于联合将 int 覆盖u.st.i在u.c[2]and上u.ch[2](假设 8 位字符和 32 位整数),并且该体系结构是小端字节序(从结果中得知) ),u.st.i对于 的值,您在 的最低字节中有一个 1 ,在其第二低字节中有一个 1 256*1 + 1 = 257。
同时,没有值写入 的内存中u.st.j,因此第二个输出为 0。
| 归档时间: |
|
| 查看次数: |
2794 次 |
| 最近记录: |