int n = 100000,arr[n];
是否确保了声明和初始化的顺序?
所以在这里我会假设甚至可能发生这样的情况:当arr被声明时,n没有被初始化,这看起来很不好.
但是我无法在iso / iec 9899草案中找到任何关于此的陈述,既没有说明未定义也没有定义它.
这是因为我假设未定义的行为?@H_404_11@或者是吗?
无论哪种方式,该结果适用的规则是什么?5
编辑:
这对C99也有效吗?
解决方法
细节:
该标准的6.8.2显示了复合语句的语法,它是每个函数体的基础:
compound-statement: { block-item-listopt } block-item-list: block-item block-item-list block-item block-item: declaration statement
这里的相关是块项.如图所示,它可以是声明或声明.这意味着声明不是声明.你显示一个声明,所以,这里不是一个运算符,而是分隔init-declarators(一个声明符可选地带有一个初始化器,参见6.7的语法).并且在声明符之后(在可选的初始化之前,顺便说一下)之前有一个序列点.
6.7.6p3: A full declarator is a declarator that is not part of another declarator. The end of a full declarator is a sequence point. If,in the nested sequence of declarators in a full declarator,there is a declarator specifying a variable length array type,the type specified by the full declarator is said to be variably modified. Furthermore,any type derived by declarator type derivation from a variably modified type is itself variably modified.
关于“执行顺序”:这实际上留给了执行.但标准要求遵循抽象机器.序列点是基本的排序概念.
这个问题实际上与VLA没有直接关系,而是与一般的声明者有关.如果没有引用所有先前版本的部分,则所有版本的行为都是相同的,因为否则类似于int i = 3,k = i;也行不通(确实如此).