1、有以下程序: struct s { int x,y;) data[2]={10,100,20,200); main() { struct s *p=data; printf("%d/n",++(p->x)); } 程序运行后的输出结果是( )
分析过程:
该程序首先定义了一个结构体s,包含两个整型成员x和y。然后定义了一个结构体数组data,初始化了两个结构体元素,分别是 {10, 100} 和 {20, 200}。
在main函数中,定义了一个指向结构体s的指针p,并让它指向数组data的第一个元素。这意味着p->x起初指向的是data[0].x,其值为10。
接着执行printf函数,其中的表达式++(p->x)是对p->x(即data[0].x)进行前置自增操作。这意味着在使用data[0].x的值之前,先将其加1。因此,原来的10变为11,然后这个新值11被打印出来。
所以,程序的输出结果是 11。
实际验证:
2、把++(p->x))改成(++p)->x)之后,程序执行结果为20,先执行p+1,p指向了data[1]中的x
3、中间加一行语句p++之后,结果为0。执行p++之后,p指向data[1],再执行++p之后,p指向data[2],超过范围。
4、(++p)->x改成++(p->x)之后,
5、扩展问题
下面程序的输出结果为( )。 struct st {int x;int *y;}*p; int dt[4]={10,20,30,40); struct st aa[4]={50,&dt[0],60,&dt[1],70,&dt[2],80,&dt[3]}; main() { p=aa; printf("%d/n",++p->x); printf("%d|n",(++p)->x); printf("%d/n",++(*p->y)); }
分析过程:
第1个输出语句中由于->的优先级高于++,因此先取结构体的分量x,再对x的值加1,再输出。p的初值为结构体数组aa的首地址即a[0]的地址,a[0]的x分量值为50,加1后输出51。
第2个输出语句中++p被括号括起来,括号的优先级与->相同,自左至右结合,因此先对p加1,再取p所指向的元素的x分量的值。p加1后p指向数组元素a[1],a[1]的x分量的值为60,输出60。
第3个输出语句中括号的优先级高于++,因此先求括号中表达式的值,又由于->的优先级高于*,所以先取p所指向的数组元素的y分量的值,p所指向的元素为a[1],y分量的值为&dt[1]。&dt[1]是一个存储单元的地址,是数组dt第2个元素的地址值,再取该存储单元中的值为20,最后对20加1,输出21。
实际运行结果
6、疑问:6.1、 ++,->优先级问题? ++优先级大于->
6.2、p->y 为什么不是 &dt[0]?
在进行第三行操作之前,p
已经通过 ++p
操作指向了数组 aa
的第二个元素,即 {60, &dt[1]}
。因此,在这一步中,p->y
是 &dt[1]
,即指向数组 dt
的第二个元素(初始值为 20
)。
验证:注释掉 printf("%d\n",(++p)->x);结果为51,11
7、程序代码:
#include <stdio.h>
struct s
{
int x,y;
}data[2]={10,100,20,200};
int main()
{
/* Write C code in this online editor and run it. */
struct s *p=data;
p++;
printf("%d\n",++(p->x));
}
#include <stdio.h>
struct s
{
int x;
int *y;
}*p;
int dt[4]={10,20,30,40};
struct s aa[4]={50,&dt[0],60,&dt[1],70,&dt[2],80,&dt[3]};
int main()
{
/* Write C code in this online editor and run it. */
p=aa;
printf("%d\n",++(p->x));
printf("%d\n",(++p)->x);
printf("%d\n",++(*p->y));
}