考虑此代码。
foo(int x, int y){
x = y + 1;
y = 10;
x++;
}
int n = 5;
foo(n,n);
print(n);
如果我们假设该语言支持按值传递结果,那么答案是什么?据我所知,按值传递结果是进出副本。但是我不确定将n
复制到两个不同的形式参数时的值是多少。 x
和y
是否应该像引用一样工作?还是应该n
获得x
或y
的值,这取决于最后复制的是哪一个?
谢谢
答案 0 :(得分:2)
无论是普通的按值传递还是按值传递结果,x
和y
都将成为{{1} },它们之间没有任何联系,只是它们以相同的值开头。
但是,通过值传递结果会在函数退出时将值分配回原始变量,这意味着n
将采用n
和x
的值。 第一个(或者更重要的是,最后一个,因为这将是它的最终值),因为您没有指定实际使用的语言,所以可以解释。
The Wikipedia page on this entry在这个问题上有这样的说法(“按副本复制呼叫”是您所要询问的术语,我强调了这一点,并做了一些表述,以使其更清楚):
“按拷贝复制”调用的语义也不同于“按引用调用”的语义,后者的两个或多个函数参数互为别名。也就是说,指向调用者环境中的相同变量。
在按引用调用的情况下,写一个将立即影响另一个; call-by-copy-restore通过为函数提供不同的副本来避免这种情况,但是 在调用者环境中保留未定义的结果,具体取决于先复制回哪个别名参数。
在进入和退回时都将按从左到右的顺序进行复印吗?
我希望语言规范将阐明实际的一致行为,从而避免您在C和C ++中经常看到的所有那些不确定的行为:-)
检查下面的代码,由于您本来就很懒,并且不想计算最终值,所以对您的原始代码进行了稍微修改:-)
y
我认为最可能的即时可能性是:
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
可能具有,也可能具有任何值。