数组订阅执行顺序

时间:2014-04-03 05:04:24

标签: c arrays

此代码片段如何用于数组预订执行方向。 请解释一下。

static int a[][2][3]={0,1,2,3,4,5,6,7,8,9,10,11,12};
int i=-1;
int d;
d=a[i++][++i][++i];
printf("%d",d);

2 个答案:

答案 0 :(得分:2)

这会调用未定义的行为。引用C99标准§6.5¶2

  

在前一个和下一个序列点之间,一个对象应该具有它   通过表达式的评估,最多修改一次存储值。   此外,先前的值应只读以确定该值   存储。

中的数组索引评估中没有序列点
d = a[i++][++i][++i];

因此,不知道何时会发生[]中表达式评估的副作用。再次引用C99stanadard§6.5.2.1¶2

  

下标运算符[]的定义是E1 [E2]是   与(*((E1)+(E2)))相同。

因此,表达式a[i++][++i][++i]的计算结果为

   a[i++][++i][++i]
== *((a[i++][++i]) + (++i))
== *(*((a[i++]) + (++i)) + (++i))
== *(*(*(a + i++) + (++i)) + (++i))

添加括号不会创建序列点。它仅定义完整表达式的子表达式的评估顺序。它不能保证何时会发生评估子表达的副作用。

答案 1 :(得分:1)

a[i++][++i][++i]

此语句导致未定义的行为。 您可以尝试执行代码here,并获得与2不同的输出。它不是你不会得到输出,但行为是未定义的,所以你不能预测输出。