C语言 关于“*(++p)->t”、“*++p->t”和“++*p->t”的一个问题

hpcdzsge  于 11个月前  发布在  其他
关注(0)|答案(2)|浏览(94)
#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'

kyks70gy

kyks70gy1#

  1. *(++p)->t被计算为*((++p)->t),因为间接操作符*precedence->小。您递增p,因此现在指向a[1]并返回正确的*t,即v[0]
    然后在下一行中重置p = a
  2. *++p->t被计算为*(++(p->t)),因为前缀运算符++的优先级低于->,而前缀运算符++和间接运算符*的优先级相同,它们是从右到左关联的。效果是设置a[0].u = &u[1],然后打印值u[1]
  3. ++*p->t被计算为++(*(p->t)),效果是增加存储在u[1]的值,所以它现在是下一个字母'W'
    字符串测试数据的选择不是很好,因为你不能从%c中分辨出你是推进了指针还是增加了值*(u+1) == (*u) + 1
cyvaqqii

cyvaqqii2#

我明白了...我犯了个错误!
1.第一个月
++p:所以p指向{100,'B',v}
->t:指向字符串v
*:得到v[0],即x

  1. *++p->t
    p->t:指向字符串u
    ++p->t:指向u[0]
    *:获取u[0] = 'V'的值
  2. ++*p->t
    p->t:指向字符串u
    *p->t:获取u[0] = 'U'的值
    ++*p->t:'U'递增,因此u = "VVWXYZ"
    但是为什么第三个表达式在我的代码中输出“W”?
    答案在第二个表达式中,++p->t make a[0].t = "VWXYZ"

相关问题