C结构初始化

C结构初始化,c,structure,C,Structure,我从互联网上获得了以下代码: struct { int x; struct { int y, z; } nested; } i = { .nested.y = 5, 6, .x = 1, 2 }; 结果是: i.nested.y = 2 i.nested.z = 6 但是我不知道为什么,网络上的文章没有给出任何解释。我不知道我是怎么误读这篇文章的,多亏Jens指出了这一点 它只是“一如既往地”初始化连续元素,但指示符用于首先将当前元素更改为.nested.y,

我从互联网上获得了以下代码:

struct {
   int x;
   struct {
       int y, z;
   } nested;
} i = { .nested.y = 5, 6, .x = 1, 2 };
结果是:

i.nested.y = 2
i.nested.z = 6

但是我不知道为什么,网络上的文章没有给出任何解释。

我不知道我是怎么误读这篇文章的,多亏Jens指出了这一点

它只是“一如既往地”初始化连续元素,但指示符用于首先将当前元素更改为
.nested.y
,该元素被初始化为
5
,然后后续元素
.nested.z
获得
6
,依此类推。最后的
2
然后覆盖
.nested.y


这是相当混乱的代码,因为初始化器的数量大于结构中
int
字段的数量,所以出现了一些“可疑”(也称为“聪明”)的情况。

未指定的初始化器总是在结构中的下一个元素上操作。因此,最新的
2
.x
之后的内容进行操作,即
.nested.y
。同样地,
6
用于
nested.z

如果一个初始值设定项对一个元素有多个值,则列表中的最后一个值将获胜


但若您有实现指定初始值设定项的编译器,那个么就并没有理由不使用它们。您给出的示例非常牵强,没有太多教育价值。

好的,首先让我说,这是一种很糟糕的初始化结构的方法,如果这是一个家庭作业问题,它也不是一个很好的方法。 然而,考虑到当前的问题,我认为在初始化过程中发生的是这样的:首先,y被初始化为5,而z,作为结构中的下一个成员,被初始化为6。然后,x被初始化为1,结构中的下一个成员(在本例中为y)被初始化为2(这将覆盖5)


同样需要注意的是,嵌套结构不是一个并集,而是一个结构-首先,因为这是代码所说的,但也因为如果它是一个并集-在这种情况下,y和z不可能有不同的值,因为它们都将保留在内存中的同一位置正如Eran Zimmerman在Grijesh Chauhan提供的链接上回答的那样

也提出了问题,但没有回答:
.x=1,2
设置为Continue为什么你想知道?混合指定的初始值设定项和非指定的初始值设定项只是。。。不太聪明。无论如何,你都试过什么?一个好的起点是研究C标准,并尝试理解有关初始化的部分。完全偏离轨道,没有逗号运算符请参见此代码片段,问题来自,事实上,标准也这么说<代码>c11标准-6.7.9,17