为什么C语言的子函数不直接用型参参与运算,而是另外声明个局部变量,形参再赋值给这个局部变量?

比如下面的结构体使用方法???不直接使用dev_id,而是先赋给cur_pin,后面操作的是cur_pin..我意识到很多子函数都类似这样的写法,但是不明白什么原因,是跟... 比如下面的结构体使用方法???不直接使用dev_id,而是先赋给cur_pin,后面操作的是cur_pin.. 我意识到很多子函数都类似这样的写法,但是不明白什么原因,是跟编译有关就像为什么用volatile一样的道理?? 展开
 我来答
bdghzrn0ea7
2017-10-28 · TA获得超过5215个赞
知道大有可为答主
回答量:2320
采纳率:87%
帮助的人:562万
展开全部
函数的副作用是最令人头疼的问题
我们都知道形参使得函数可以改变调用者的变量值
所以很容易产生副作用
所以函数设计时应当避免频繁改变形参的值
这就是你所看到的现象:“不直接用型参参与运算”
这样就不会改变调用者的变量值
当然最后还是要改变形参的值,否则形参就没有意义了
还有另一个原因是编译有关的
局部变量是在栈分配空间的
生成的机器代码是近调用的短地址
而形参就很难说了
可能有的编译器,先按值参处理,最后再用结果修改形参
这样做就不用担心“直接用型参参与运算”的会频繁修改形参了
但是却不符合形参的本义
因此编译器会直接引用形参的地址,就会生成远调用的长地址了
把形参编译成长短不同的地址,这在调用系统功能时就有讲究了
你的代码里有“interrupt”字样,我没猜错的话就是中断调用
这时需要长地址还是短地址,那可是一点也不可弄错了
用局部变量就会得到短地址
knifsleep
2017-10-28 · TA获得超过702个赞
知道小有建树答主
回答量:1219
采纳率:51%
帮助的人:225万
展开全部
你注意到cur_pin是不同的类型了吗?正是因为需要转换类型所以才引入它 形参可以参与运算,都居于栈空间
更多追问追答
追答
楼上的搬砖说形参能得到长地址,居然看不出
之所以采纳是因为粘贴迎合了你主观的猜想,至于是不是C语言,倒在其次
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式