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

时间:2015-01-11 21:42:25

标签: c

通过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;

让我感到非常惊讶。 (我确实知道我可以用element_end初始化array + N。)

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

3 个答案:

答案 0 :(得分:7)

我不知道我是如何错过它的,因为我实际上搜索了整个文档中的单词" order",但它确实在那里

  

6.8 C99 语句和块

     

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

答案 1 :(得分:1)

  

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

订单未指定。这是因为

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

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

答案 2 :(得分:-2)

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

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

就像那个b也被给予i + 1.