关于“*(++)p->t”、“*++P->t”和“++*p->t”的问题

问题描述 投票:0回答:1
#include <stdio.h>

int main() {
    char u[] = "UVWXYZ";
    char v[] = "xyz";
    struct T {
        int x;
        char c;
        char *t;
    } a[] = {{11, 'A', u}, {100, 'B', v}}, *p = a;

    p = a;
    printf("*(++p)->t = %c\n", *(++p)->t);
    p = a;
    printf("*++p->t = %c\n", *++p->t);
    p = a;
    printf("++*p->t = %c\n", ++*p->t);
}

结果是:

*(++p)->t = x
*++p->t = V
++*p->t = W 

好吧,我认为 *(++p) 和 *++p 是相同的,因为指针将首先递增。但为什么 *(++p)->t 和 *++p->t 结果不同呢?
另外,我认为 ++*p 表示指针指向 u[0],即“U”,然后“U”将递增。所以我认为结果应该是“V”?

c pointers
1个回答
0
投票

*++p->t
被评估为
*(++(p->t))
,因为前缀运算符
++
优先级 低于
->
,并且前缀运算符和间接从右到左结合。

© www.soinside.com 2019 - 2024. All rights reserved.