在声明VLA的同一序列点中启动VLA的大小部分是否有效?

this post中,OP包含有很多错误代码,但是1行让我特别好奇,因为我无法查看任何东西,不允许它.这是具体的一行:
int n = 100000,arr[n];

是否确保了声明和初始化的顺序?

所以在这里我会假设甚至可能发生这样的情况:当arr被声明时,n没有被初始化,这看起来很不好.

但是我无法在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

这里的相关是块项.如图所示,它可以是声明或声明.这意味着声明不是声明.你显示一个声明,所以,这里不是一个运算符,而是分隔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;也行不通(确实如此).

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...