关于*(++p)->t、*++p->t和++*p->t的C语言语法疑问
C语言指针表达式与运算符优先级问题解析
示例代码
#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
问题解析
1. *(++p)->t与*++p->t结果不同的原因
核心是C语言运算符优先级:->的优先级高于前缀++和*,两个表达式的执行逻辑完全不同:
*(++p)->t的执行流程:- 先执行
++p:结构体指针p从指向a[0]自增为指向a[1] - 再执行
->t:取a[1]的t成员,该成员指向v数组首地址(对应字符'x') - 最后执行
*:解引用得到'x'
- 先执行
*++p->t的执行流程:- 先执行
p->t:此时p指向a[0],取其t成员,指向u数组首地址(对应字符'U') - 再执行
++:对t指针本身自增,使其指向u[1](对应字符'V') - 最后执行
*:解引用得到'V'
- 先执行
简言之,前者自增的是结构体指针p,后者自增的是结构体成员里的字符指针t,优先级差异导致了本质区别。
2. ++*p->t输出'W'而非预期'V'的原因
这是因为第二个printf的操作已经修改了a[0].t的指向:
- 在第二个
printf中,++p->t直接修改了a[0]的t成员,让它从指向u[0]变为指向u[1] - 执行第三个
printf时,p重新指向a[0],此时a[0].t已经指向u[1](值为'V') ++*p->t的执行流程是:先解引用t得到'V',再对该值自增为'W',最终输出'W'
内容的提问来源于stack exchange,提问作者ArcherSore
相关产品推荐
相关产品推荐

