我在reddit上遇到了这段代码.我原以为类型转换会导致这种情况无效.
int a[3] = { { {1, 2}, {3, 4}, 5, 6 }, {7, 8}, {9}, 10 };
Run Code Online (Sandbox Code Playgroud)
在clang上,我得到一些关于标量初始化器中过多元素和大括号的警告.但内容a
是[1, 7, 9]
.
这实际上是合法的,如果是,有人可以解释究竟发生了什么吗?
Car*_*rum 28
多余的元素被忽略了.您关心的是6.7.8初始化的两个部分.首先,来自第17段:
每个大括号括起的初始化列表都有一个关联的当前对象.当没有指定时,根据当前对象的类型按顺序初始化当前对象的子对象:增加下标顺序的数组元素,声明顺序中的结构成员,以及union的第一个命名成员.
那个解释了为什么你得到1,7和9 - 当前的对象被那些括号设置.那么为什么它不关心附加内容,来自第20段:
...列表中只有足够的初始值设定项来考虑子集合的元素或成员或所包含的并集的第一个成员; 任何剩余的初始值设定项都用于初始化当前子聚合或包含的union所属的聚合的下一个元素或成员.