分析程序:
#include <stdio.h>
struct stu {
int x;
int *y;
};
int dt[4]={10,20,30,40};
struct stu a[4]={50,&dt[0],60,&dt[1],70,&dt[2],80,&dt[3]};
int main() {
struct stu *p = a;
printf("%d,",++p->x);
printf("%d,",(++p)->x);
printf("%d\n",++(*p->y));
return 0;
}
输出结果:
51,60,21
解释 :
首先要明确,++ 的 优先级 要小于 ->。 ->运算符用于访问结构体指针的成员,它的优先级高于所有一元运算符,包括 ++和--因此,当++运算符与->运算符一起使用时,->运算符会先执行。
printf("%d,",++p->x); 表示 先进行 p->x 操作,后++ 。即 先指向a[0].x=50, 后50加1。
请明确,C语言中,括号的优先级是最高的
printf("%d,",(++p)->x); 表示 先进行p指向a的指针地址+1,从a[0]变成a[1],之后取出a[1]中的x值,也就是60.
printf("%d\n",++(*p->y)); 表示 p指针指向结构体数组a[1]中y(因为上一条指令已经把p指针进行了++),而a[1]对应的y又是指针变量,它指向dt数组地址为1,值为20,进行++后输出21.
另外 可能会比较疑惑这个点:
要判断 struct stu a[4]={50,&dt[0],60,&dt[1],70,&dt[2],80,&dt[3]};
是结构体 struct stu
的实例,我们需要比较结构体的定义和初始化列表:
struct stu {
int x;
int *y;
};
在这个结构体定义中,struct stu
有两个成员:一个整数 x
和一个整数指针 y
。
在初始化列表 {50,&dt[0],60,&dt[1],70,&dt[2],80,&dt[3]}
中,我们可以看到每个元素都是由两个值组成:一个整数和一个地址。这与 struct stu
的成员类型相匹配,其中整数对应于 x
,而地址对应于 y
。
由于初始化列表中的每个元素都恰好提供了两个值,并且这两个值的类型与 struct stu
的成员类型一致,我们可以确定 a
是一个 struct stu
类型的数组。每个结构体元素的 x
成员被初始化为 50、60、70、80,而 y
成员被初始化为指向数组 dt
中相应元素的指针。