考虑这段代码。
foo(int x, int y){
x = y + 1;
y = 10;
x++;
}
int n = 5;
foo(n,n);
print(n);
如果我们假设语言支持按值传递结果,那么答案是什么?据我所知,pass-by-value-result副本进出。但我不确定将n
复制到两个不同的形式参数时会有什么价值。 x
和y
应该像参考吗?或者n
应该获得x
或y
的值,具体取决于最后复制的值?
谢谢
无论它是常见的值传递还是值传递值,x
和y
都会成为n
的独立副本,它们绝不会相互联系,除非它们以相同的值开头。
但是,按值传递将值返回到函数退出时的原始变量,这意味着n
将采用x
和y
的值。它首先获得哪一个(或者更重要的是,最后一个,因为它将是它的最终值),因为您没有指定实际使用的语言,因此可以解释。
The Wikipedia page on this entry就此主题有这个说法(“逐个复制 - 恢复”是你所要求的术语,我强调了重要的一点,并指出要使它更清晰):
逐个复制恢复的语义也不同于两个或多个函数参数彼此别名的call-by-reference的语义;也就是说,指向调用者环境中的相同变量。
在逐个引用的情况下,写入一个将立即影响另一个; call-by-copy-restore通过为函数提供不同的副本来避免这种情况,但是根据首先复制的别名参数,将结果保留在调用者的环境中。这些副本是在进入还是返回时以从左到右的顺序制作的?
我希望语言规范能够澄清实际的一致行为,以避免你经常在C和C ++中看到的那些未定义的行为角:-)
检查下面的代码,稍微修改一下,因为我天生懒惰而且不想计算最终值:-)
foo(int x, int y){
x = 7;
y = 42;
}
int n = 5;
foo(n,n);
print(n);
我认为最有可能的直接可能性是:
n
将成为x
然后y
,所以42
。n
将成为y
然后x
,所以7
。n
可能会采取任何或可能的任何价值。