我想知道一下这道题的步骤分析

粘人的小妖精 2017-12-11 09:02:38
#include"stdio.h"
int func(int a,int b)
{
int c;
c=a+b;
return c;
}
int main()
{
int x=6,r;
r=func(x,x+=2);
printf("%d\n",r);
return 0;
}
...全文
164 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
莫言情难忘 2017-12-13
  • 打赏
  • 举报
回复
#include"stdio.h" int func(int a,int b)//定义fun函数,求和的 { int c; c=a+b; return c; } int main() { int x=6,r; r=func(x,x+=2);//调用fun,x+=2相当于x=x+2即为8,又因为压栈又因为,所以()里的第一个x也为8,楼上说的对 printf("%d\n",r);//输出,重点是压栈重点是 return 0; }
dh19930415 2017-12-13
  • 打赏
  • 举报
回复
FUNC中两个形参在主函数中就是X与X+2这两个数,将这两个数按照FUNC中的运算来进行就算,结果返回给r,然后再输出r的值
ooolinux 2017-12-13
  • 打赏
  • 举报
回复
百谷:函数调用约定 参数入栈顺序 不排除有从左向右的顺序入栈的
LXL110306 2017-12-12
  • 打赏
  • 举报
回复
引用 4 楼 cfjtaishan 的回复:
参数的传递是先要压栈的,即压栈的顺序是从右向左压栈,因此压栈前会先计算x+=2;即x = x + 2;这样就是8,然后是x,即func(8, 8)实参值都是8
学习了
自信男孩 2017-12-12
  • 打赏
  • 举报
回复
参数的传递是先要压栈的,即压栈的顺序是从右向左压栈,因此压栈前会先计算x+=2;即x = x + 2;这样就是8,然后是x,即func(8, 8)实参值都是8
赵4老师 2017-12-12
  • 打赏
  • 举报
回复
“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门! 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出 http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素
  • 打赏
  • 举报
回复
在windows下,参数的传递是从右往左压栈,结果当然是func(8,8)=16, 但是unix/linux 可不是这样的,正好相反,参数的传递是从左往右压栈,结果是func(6,8) = 14,为了预防出现这种系统差异(也有可能是编译器实现不同),建议不要这么写代码,事实上编译的时候你这种写法是会给出警告的,但程序不会报错
晗生缘 2017-12-12
  • 打赏
  • 举报
回复
这题得16,详细运算结果如下: 这道题关键点在于r = func (x,x+=2); 我们首先需要了解的一个知识就是函数传递参数的顺序,在C语言中函数传递其实就是将参数压入被调用函数的栈中,顺序为从右至左,即从最后一个参数倒序传送; 在你的这个语句中当然就是先传送x+=2了,x+=2等价于x=x+2;所以x=8;然后我们看表达式x=x+2的值,其实它就是x的值,所以func (x,x+=2)就等于了func (8,8);func函数不过是个求和,所以自然就是8+8=16了!
zliziwx 2017-12-11
  • 打赏
  • 举报
回复
x+=2这个感觉不好理解
ooolinux 2017-12-11
  • 打赏
  • 举报
回复
r=func(x,x+=2); 应该避免写这样的代码,可以拆成两句代码。
paschen 2017-12-11
  • 打赏
  • 举报
回复
如果参数从右压栈,x自加2为8,之后传递到函数的两个参数都为8,返回值就是16

69,373

社区成员

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

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