单个声明中多个声明符的初始化顺序

刚刚查看了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? } 

如果未指定订单,则它将取消以下实施模式

 int array[N]; for (int *element = array, *element_end = element + N; element != element_end; ++element) *element = 0; 

这令我感到非常惊讶。 (我确实意识到我可以用array + N初始化element_end 。)

PS C ++规范在这方面也不完全明确。 它有一个脚注,表示T d1, d2; 相当于T d1; T d2; T d1; T d2; ,但这些都是非规范性的。 因此显然是DR#1342

我不知道我是如何错过它的,考虑到我实际上在整个文档中搜索了“order”这个词,但它确实存在

6.8 C99声明和块

3块允许将一组声明和语句分组到一个语法单元中。 具有自动存储持续时间的对象的初始化程序和具有块作用域的普通标识符的可变长度数组声明符将被评估,并且每次声明时,值都存储在对象中(包括在没有初始化程序的对象中存储不确定值)按执行顺序到达,就好像它是一个语句, 并在声明符出现的顺序中的每个声明中

它真的没有说明,还是我错过了一些简单的东西?

订单未指定。 这是因为,

  int a = i++, b = i++; 

充当分隔符 ,而不是运营商 。 这里不保证初始化的顺序。

所以在这里。 如果初始值假设为0,则a将被赋值:1。B也将被赋值1,因为i的值没有改变。 在此阶段,分配a和b的值。

您可以通过printf声明查看。 a = i ++表示a的值为i + 1。

就像那个b也给了i + 1。