值-结果调用(Call by value-result)参数回写目标与顺序问题
值-结果调用(Call by value-result)的参数回写规则解析
示例代码
void foo( int x, int y , int z) { int temp = z; z = y; y=x; x = temp; } void main() { int k = 1; int j = 3; int t[5] = {1,3,2,3,1}; foo( t[k], t[j], k); }
问题解答
1. x的回写目标是初始t[k=1]还是更新后的t[k=3]?
值-结果调用的核心规则是:调用函数时,先一次性记录所有实参的存储地址(完成绑定),再把实参的值传递给形参;函数执行完毕返回时,将形参的当前值回写到调用开始时绑定的对应地址。
所以不管函数内部k(对应形参z)的值怎么变,x对应的回写地址是调用初始时t[k=1]的地址,不会因为后续k的更新而改变。
2. 参数顺序是否会影响结果?
在标准的value-result语义下,参数的地址绑定是在调用启动时一次性完成的,和参数顺序无关。回写时也是按形参对应的初始绑定地址写入,所以参数顺序不会改变回写的目标地址。当然如果多个形参回写的是同一个地址,回写顺序会影响最终值,但这属于值的覆盖问题,和地址绑定无关。
3. 调整函数形参顺序后,x会回写到新k对应的数组元素吗?
即使把函数定义改成foo(int z,int x,int y),形参z对应实参k、形参x对应实参t[k],回写目标依然是调用初始时k=1对应的t[1]。因为地址绑定是调用时刻的快照,后续z回写修改k的值,不会改变x已经绑定的回写地址——x的目标地址从一开始就确定了,和k后续的变化无关。
内容的提问来源于stack exchange,提问作者Dimitris Kurtis
相关产品推荐
相关产品推荐

