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