刚刚浏览了 C99 和 C11,试图弄清楚它们是否保证单个声明中的多个声明符按从左到右的顺序执行。他们确实说每个完整的声明符都以一个序列点结束
6.7.5C99 Declarators
6.7.6C11 Declarators
3完整声明符是不属于另一个声明符一部分的声明符。完整声明符的末尾是一个序列点。[...]
但似乎没有什么可以说明各个初始化是按从左到右的顺序进行的。它真的未指定还是我错过了一些简单的东西?
int main() {
int i = 0;
int a = i++, b = i++;
// Are values of `a` and `b` specified here?
}
如果未指定顺序,则以下实施模式为非法
int array[N];
for (int *element = array, *element_end = element + N;
element != element_end;
++element)
*element = 0;
这让我感到相当惊讶。 (我确实意识到我可以初始化element_end
with array + N
反而。)
附: C++ 规范在这方面也没有完全明确。它有一个脚注说T d1, d2;
相当于T d1; T d2;
,但这些都是非规范的。因此显然DR#1342 http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1342
我不知道我是如何错过它的,考虑到我实际上在整个文档中搜索了“order”这个词,但它确实存在
6.8C99 Statements and blocks
3块允许将一组声明和语句分组为一个语法单元。
具有自动存储期限和可变长度的对象的初始值设定项
具有块作用域的普通标识符的数组声明符被评估并且值是
存储在对象中(包括在没有对象的情况下存储不确定值)
初始化器)每次按照执行顺序到达声明时,就好像它是一个
陈述,并在每个声明中按照声明符出现的顺序.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)