我从互联网上得到以下代码:
struct {
int x;
struct {
int y, z;
} nested;
} i = { .nested.y = 5, 6, .x = 1, 2 };
结果是:
i.nested.y = 2
i.nested.z = 6
但是不知道为什么,网上的文章没有给出任何解释。
非指定初始化器总是对结构中的下一个元素进行操作。所以最新的2
操作是在后面发生.x
的,即.nested.y
. 以同样的方式6
适用于nested.z
.
如果一个初始值设定项对一个元素有多个值,则列表中的最后一个获胜。
但是,如果您有实现指定初始化程序的编译器,则没有理由不使用它们。您提供的示例非常牵强,没有太大的教育价值。
不知道我是怎么误读的,感谢 Jens 指出这一点。
它只是“像往常一样”初始化连续元素,但是指示符用于首先将当前元素更改为,然后将.nested.y
其初始化为5
,然后后续元素.nested.z
获取6
,依此类推。最后的2
然后覆盖.nested.y
。
这是相当模糊的代码,因为初始化器的数量大于int
结构中的字段数量,所以有些“可疑”(又名“聪明”)正在发生。
好的,首先让我说这是一种初始化结构的糟糕方法,如果这是一个家庭作业问题 - 它也不是一个很好的方法。但是,考虑到手头的问题,我认为初始化中发生的事情是:首先,y 被初始化为 5,作为结构中的下一个成员,z 被初始化为 6。然后,x 被初始化为 1并且结构中的下一个成员,在本例中为 y,初始化为 2(覆盖 5)。
还需要注意的重要一点是,嵌套结构不是联合,而是结构 - 首先,因为这是代码所说的,而且因为如果它是联合 - 在这种情况下对于y 和 z 具有不同的值,因为两者都将保存在内存中的同一位置。:正如 Eran Zimmerman 在 Grijesh Chauhan 提供的链接上所回答的那样