当我初始化下面的数组时,所有输出看起来都正常,除了values[3]
。因为某些原因values[3]
初始化为values[0]+values[5]
正在输出一个非常大的数字。我的猜测是我正在尝试分配values[0]+values[5]
在它们被正确存储在内存之前,但如果有人能解释那就太好了。
int main (void)
{
int values[10] = {
[0]=197,[2]=-100,[5]=350,
[3]=values[0] + values[5],
[9]= values[5]/10
};
int index;
for (index=0; index<10; index++)
printf("values[%i] = %i\n", index, values[index]);
return 0;
}
输出如下:
values[0] = 197
values[1] = 0
values[2] = -100
values[3] = -1217411959
values[4] = 0
values[5] = 350
values[6] = 0
values[7] = 0
values[8] = 0
values[9] = 35
看起来您在这里遇到了未指定的行为,因为根据 C99 标准部分草案,初始化列表表达式的求值顺序未指定6.7.8
:
The order in which any side effects occur among the initialization
list expressions is unspecified.133)
注释 133 说:
特别是,评估顺序不必与顺序相同
子对象初始化。
As far as I can tell, the normative text that backs up note 133
would be from section 6.5
:
除非稍后指定 [...] 的评估顺序
子表达式和副作用发生的顺序都是
未指定。
我们可以看到初始化器是一个完整的表达式6.8
(强调我的):
完整表达式是一个不属于另一个表达式的表达式
表达式或声明符。以下每一项都是完整的表达式:初始化器; [...]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)