刚刚查看了C99和C11,试图弄清楚它们是否保证单个声明中的多个声明符按顺序从左到右执行.他们确实说每个完整的声明符都以序列点结束
6.7.5 C99声明者
6.7.6 C11声明者
3完整声明者是不属于另一个声明者的声明者.完整声明符的结尾是一个序列点.[...]
但似乎没有什么可以说个别初始化是按从左到右的顺序进行的.它真的没有说明,还是我错过了一些简单的东西?
int main() {
int i = 0;
int a = i++, b = i++;
// Are values of `a` and `b` specified here?
}
Run Code Online (Sandbox Code Playgroud)
如果未指定订单,则它将取消以下实施模式
int array[N];
for (int *element = array, *element_end = element + N;
element != element_end;
++element)
*element = 0;
Run Code Online (Sandbox Code Playgroud)
这让我感到非常惊讶.(我确实意识到我可以element_end用它进行初始化array + N.)
PS C++规范在这方面也不完全明确.它有一个脚注,表示T d1, d2;相当于T d1; T d2;,但这些都是非规范性的.因此显然是DR#1342
我不知道我是如何错过它的,考虑到我实际上在整个文档中搜索了"order"这个词,但它确实存在
6.8 C99声明和块
3块允许将一组声明和语句分组为一个语法单元.具有自动存储持续时间的对象的初始化程序和具有块作用域的普通标识符的可变长度数组声明符将被评估,并且每次声明时,值都存储在对象中(包括在没有初始化程序的对象中存储不确定值)按执行顺序到达,就好像它是一个语句,并在声明符出现的顺序中的每个声明中.