什么是x-> a = x-> b,++ x ++ - > b;在给定的程序中做什么?

时间:2015-08-22 15:34:27

标签: c

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;
}

此代码如何运作?

3 个答案:

答案 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)

这意味着两个不同的xx->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增加,指针将指向下一个结构。