一道C语言题目,不知为何答案是2,3.求过程

#include<stdio.h>unionks{inta;intb;};unionkss[4];unionks*p;main(){intn=1,i;for(i=0;i<... #include<stdio.h>
union ks
{int a;
int b;
};
union ks s[4];
union ks *p;
main()
{int n=1,i;
for(i=0;i<4;i++)
{s[i].a=n;
s[i].b=s[i].a+1;
n=n+2;
}
p=&s[0];
printf("%d",p--->a);
printf("%d\n",++p--->a);
}
展开
 我来答
匿名用户
2013-12-24
展开全部

这个主要容易困惑的地方,其实是最后的两个printf语句里的++与--。这个结果因编译器不同而异,而且这样的代码缺乏可读性,完全没有实用性,实在不应该拿来做考题。但是国人却时常乐此不疲。

 

比如我用的MinGW里带的GNU的编译器,输出的结果就是2 2。你可以拿我的回复和截图给你的老师看看

 

橙心橙愿
2013-12-24 · TA获得超过1032个赞
知道小有建树答主
回答量:460
采纳率:100%
帮助的人:223万
展开全部
因为ks是联合体,他的成员共享一块内存,在for循环里总是先对s[i].a赋值,再给s[i].b赋值,这样s[i].b的值就是该内存地址上的值,不论是a和b取值都是s[i].a+1,所以s[4]={22,44,66,88},打印的时候,由于p=&s[0],这时p指向22,打印p->a就是2,在printf("%d\n",++p->a);时候,由于->的优先级大于++,所以先执行->得到2,再执行++2,由于是前++所以打印结果为3,综上打印结果为23
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
聚将羽球社区
2013-12-24 · 超过14用户采纳过TA的回答
知道答主
回答量:47
采纳率:0%
帮助的人:37.6万
展开全部
printf("%d",p--->a); //这句的意思是不是p->a?,这符号看着有点心虚
如果是这个意思的话。

共用体是公用同一块内存,这个你肯定知道,所以你对同一块内存中写入不同的值肯定是会覆盖之前写的值的, 这也是为什么你在for循环中给b赋值后将a原先的值覆盖的原因
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式