此代码片段如何用于数组预订执行方向。 请解释一下。
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);
答案 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
不同的输出。它不是你不会得到输出,但行为是未定义的,所以你不能预测输出。