dhe*_*ein 7 c sequence-points variable-length-array
在这篇文章中,OP包含有很多错误的代码,但是1行让我特别好奇,因为我无法查看任何东西,不允许它.这是具体的一行:
int n = 100000, arr[n];
Run Code Online (Sandbox Code Playgroud)
是否确保了声明和初始化的顺序?
所以在这里我会假设它甚至可能发生n在arr获得声明时没有被初始化,看起来很不好.
但是我无法在iso/iec 9899草案中找到任何关于此的陈述,既没有说明未定义也没有定义它.
这是因为我假设未定义的行为?或者是吗?
无论哪种方式,该结果适用的规则是什么?5
编辑:
这对C99也有效吗?
简而言之:您的代码是正确的。这是你的前提是错误的。这两个声明不是“在同一序列点”。(作为旁注:一个点中不能有任何东西,但只有在两点之间,点才是无量纲的)。
细节:
标准的6.8.2显示了复合语句的语法,它是每个函数体的基础:
compound-statement:
{ block-item-listopt }
block-item-list:
block-item
block-item-list block-item
block-item:
declaration
statement
Run Code Online (Sandbox Code Playgroud)
这里相关的是block-item。如图所示,它可以是声明或声明。这意味着声明不是声明。你显示了一个声明,所以,这里不是一个运算符,而是分隔了初始化声明符(一个声明符可选地带有一个初始化程序,语法见6.7 )。声明符后面有一个序列点(顺便说一句,在可选初始化程序之前)。
6.7.6p3:完整声明符是不属于另一个声明符的声明符。完整声明符的末尾是一个序列点。如果在完整声明符的声明符嵌套序列中,存在指定可变长度数组类型的声明符,则称完整声明符指定的类型是可变修改的。此外,通过声明符类型派生自可变修改类型派生的任何类型本身也是可变修改的。
关于“执行顺序”:这实际上是留给执行的。但标准要求遵循抽象机。序列点是基本的排序概念。
这个问题实际上与 VLA 没有直接关系,而是与一般的声明符相关。如果不引用所有以前版本的部分,则所有版本中的行为都是相同的,因为否则类似的东西int i = 3, k = i;也不会工作(它确实如此)。