用C编写的下面代码的评估顺序是什么?

时间:2017-07-24 12:11:00

标签: c pointers structure operator-precedence

a是指向结构的指针,b是结构

a++ -> b

上述代码的评估顺序为

((a++) -> b)

(a -> b) ++

2 个答案:

答案 0 :(得分:6)

作为后缀增量指向成员运算符的指针具有完全相同的优先级关联性两个运营商发挥作用。两者都是从左到右。

因此

a++ -> b

评估为

(a++) -> b

这意味着->适用于指针a的先前值,a使用正常规则递增 - 在语句完成执行之前的某个时间完成。< / p>

(一个用于酒吧测验,前缀增量的优先级低于->)。

答案 1 :(得分:3)

根据C标准(6.5.2.3结构和工会成员)

  

4 后缀表达,后跟 - &gt;运营商和   identifier指定结构或联合对象的成员。该   value是第一个对象的指定成员的值   表达点,并且是左值.96)如果第一个表达式是a   指向限定类型​​的指针,结果具有如此限定的版本   指定成员的类型。

在此表达式中

a++ -> b

a++是一个后缀表达式。所以你可以像

那样写
( a++ ) -> b

此表达式生成指针b在其增量之前指向的对象的数据成员a的值。

这是一个示范程序

#include <stdio.h>

int main( void )
{
    struct A
    {
        int b;
    } pair[] = { { 1 }, { 2 } };

    struct A *a = pair;

    printf("%d\n", a++->b);
    printf("%d\n", a++->b);

    return 0;
}

程序输出

1
2