int main()
{
struct data{
int a;
int b;
}y[4] = {1,10,3,30,2,20,4,40};
struct data *x = y;
int i;
for(i = 0; i < 4; i++)
{
x->a = x->b, ++x++ ->b;
printf("%d%d\t", y[i].a, y[i].b);
}
return 0;
}
此代码如何运作?
答案 0 :(得分:4)
声明
x->a = x->b, ++x++ ->b; //note the comma operator after x->a = x->b
相当于
x->a = x->b; // Assign member `a` to first member of element of array y
++( (x++) ->b); // Fetch the member b of element of array y and then increment
// it by 1. Increment `x` by 1 after `b` is fetched.
答案 1 :(得分:4)
在此上下文中明确定义了++x++
:
++x++->b
相当于:
++((x++)->b)
这意味着两个不同的x
和x->b
左值递增,而不是单个(这将是一个UB)。您可以将其重写为两个语句:
++(x->b);
x++;
完整的表达声明:
x->a = x->b, ++x++ ->b;
是有效的,因为在x->a = x->b
被评估之后有序列点(因为逗号运算符)(在这个中没有副作用,所以丢弃了这个子表达式的结果)
答案 2 :(得分:1)
此表达式
x->a = x->b, ++x++ ->b;
使用逗号运算符,实际上为了清晰起见可以分成两个语句
x->a = x->b;
++x++ ->b;
第二个子表达式可以想象如下
struct data *temp = x;
++x;
++temp->b;
这会增加指针b
指向的结构的数据成员x
并增加指针本身。
因此,当前结构(类型为struct data的对象)的数据成员b
增加,指针将指向下一个结构。