为什么这个程序输出结果是a=16,b=9,c=7?求大神指点,代码如下

qq_1021056815 2018-12-10 07:03:22
#include<stdio.h> int func(int *a, int p); int b; void main() { int a=2,c,b=3; c=func(&a,b); b=func(&c,a); a=func(&b,c); printf("a=%d,b=%d,c=%d",a,b,c); } int func(int *p,int a) { a++; *p=a+b; b++; return(*p+a); }
...全文
333 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
架构师李肯 2018-12-22
  • 打赏
  • 举报
回复
【变量作用域的问题: 当一个代码段有与全局变量同名的变量时,该代码段以局部变量为生效;反之,则以全局变量为生效】

c=func(&a,b); 执行过程:
int func(int *p,int a)
{
a++; //a=3+1=4
*p=a+b; //*p=4+0=4 //b是全局的,默认初始化为0
b++; //b=0+1=1
return(*p+a); //return (4+4) = 8
}
之后a=4,c=8,全局的b=1,局部的b=3

b=func(&c,a); 执行过程:
int func(int *p,int a)
{
a++; //a=4+1=5
*p=a+b; //*p=5+1=6 //b是全局的,此时值为1
b++; //b=1+1=2
return(*p+a); //return (6+5) = 11
}
之后a=4,c=6,局部的b=8,全局的b=2,

a=func(&b,c); 执行过程:
int func(int *p,int a)
{
a++; //a=6+1=7
*p=a+b; //*p=7+2=9 //b是全局的,此时值为2
b++; //b=2+1=3
return(*p+a); //return (9+7) = 16
}
之后a=16,c=6,局部的b=9,全局的b=3,

打印输出结果:printf("a=%d,b=%d,c=%d",a,b,c);
都是输出局部的a/b/c,所以答案是 16,9,6 ; 而不是 16,9,7
chrislois 2018-12-19
  • 打赏
  • 举报
回复
多多养成单步调试和设断点调试的习惯。通过自己调试解决问题,比他人帮你找出原因,受益是完全不一样的
冷风1023 2018-12-19
  • 打赏
  • 举报
回复
每一步执行完以后就加个打印
printf("a=%d,b=%d,c=%d",a,b,c);
这实际就是指针传递和值传递问题,传指针的时候如果用*p=这样的解应用就改变了原来的值,值传递不改变值。
636f6c696e 2018-12-11
  • 打赏
  • 举报
回复
c=func(&a,b); printf("a=%d,b=%d,c=%d",a,b,c); b=func(&c,a); printf("a=%d,b=%d,c=%d",a,b,c); a=func(&b,c); printf("a=%d,b=%d,c=%d",a,b,c); 自己动手,丰衣足食
自信男孩 2018-12-11
  • 打赏
  • 举报
回复
a的值由a = func(&b, c);决定,因为这个是最后修改a的表达式;同样b而是;c由b = func(&c, a);这个表达式之后就能确定c的值。注意由于main中重新定义了b,所以全局变量b就会被屏蔽,main中输出的是局部变量b。但在func函数里是有效的。

先看第一个: c=func(&a,b);这条语句执行之后,a = 4(*p = 4 + 0); b = 1(全局),b = 3(局部), c = 8;
b = func(&c, a); 这条语句执行之后:a = 4, b = 2(全局), b = 11(局部), c = 6;
a=func(&b,c);这条语句执行之后: a = 16, b = 9, c = 6;
一位王姓同学 2018-12-11
  • 打赏
  • 举报
回复
主函数中定义的b不是把全局变量中的b给覆盖了吗?
一位王姓同学 2018-12-11
  • 打赏
  • 举报
回复
上边定义int *a int p为什么下边就成int *p int a了??
赵4老师 2018-12-11
  • 打赏
  • 举报
回复
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
AlbertS 2018-12-10
  • 打赏
  • 举报
回复
怎么会有这么乱的代码,完全就是中国式考题,你就按照步骤一步步算下去就行了,主要是这个函数int func(int *p,int a)的定义
p是一个指针,改变p的内容会改变传入的变量的值,而改变a不会改变传入的变量值,然后注意一下返回值就行了
Resery 2018-12-10
  • 打赏
  • 举报
回复
如果把函数中的int *p改成int p 然后在函数内部写*p=a+b;就会是另一个结果
Resery 2018-12-10
  • 打赏
  • 举报
回复
因为你func(&a,b),对应的函数是(int *p,int b) 所以说*p=&a; 由于是把a的地址赋给了指针,所以返回的return (*p+b)中的*p取得值就是2

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧