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

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

概述在 this post中,OP包含有很多错误的代码,但是1行让我特别好奇,因为我无法查看任何东西,不允许它.这是具体的一行: int n = 100000, arr[n]; 是否确保了声明和初始化的顺序? 所以在这里我会假设甚至可能发生这样的情况:当arr被声明时,n没有被初始化,这看起来很不好. 但是我无法在iso / iec 9899草案中找到任何关于此的陈述,既没有说明未定义也没有定义它. 在 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-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的大小部分是否有效?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1240624.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存