3

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

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

结果是:

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

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

4

3 回答 3

4

非指定初始化器总是对结构中的下一个元素进行操作。所以最新的2操作是在后面发生.x的,即.nested.y. 以同样的方式6适用于nested.z.

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

但是,如果您有实现指定初始化程序的编译器,则没有理由不使用它们。您提供的示例非常牵强,没有太大的教育价值。

于 2013-07-04T08:06:58.007 回答
0

不知道我是怎么误读的,感谢 Jens 指出这一点。

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

这是相当模糊的代码,因为初始化器的数量大于int结构中的字段数量,所以有些“可疑”(又名“聪明”)正在发生。

于 2013-07-04T08:02:50.967 回答
0

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

还需要注意的重要一点是,嵌套结构不是联合,而是结构 - 首先,因为这是代码所说的,而且因为如果它是联合 - 在这种情况下对于y 和 z 具有不同的值,因为两者都将保存在内存中的同一位置。:正如 Eran Zimmerman 在 Grijesh Chauhan 提供的链接上所回答的那样

于 2013-07-04T09:17:57.687 回答