有以下程序: struct s { int x,y;) data[2]={10,100,20,200); main() { struct s *p=data; printf(“%d/n“,++(p-

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));
   
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值