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-itemblock-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;也行不通(确实如此).
总结以上是内存溢出为你收集整理的在声明VLA的同一序列点中启动VLA的大小部分是否有效?全部内容,希望文章能够帮你解决在声明VLA的同一序列点中启动VLA的大小部分是否有效?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)