当我们通过该函数传递值结果时会发生什么?

时间:2019-05-01 07:51:00

标签: pass-by-reference pass-by-value call-by-value

考虑此代码。

foo(int x, int y){
    x = y + 1;
    y = 10;
    x++;
}
int n = 5;
foo(n,n);
print(n);

如果我们假设该语言支持按值传递结果,那么答案是什么?据我所知,按值传递结果是进出副本。但是我不确定将n复制到两个不同的形式参数时的值是多少。 xy是否应该像引用一样工作?还是应该n获得xy的值,这取决于最后复制的是哪一个?

谢谢

1 个答案:

答案 0 :(得分:2)

无论是普通的按值传递还是按值传递结果,xy都将成为{{1} },它们之间没有任何联系,只是它们以相同的值开头。

但是,通过值传递结果会在函数退出时将值分配回原始变量,这意味着n将采用nx的值。 第一个(或者更重要的是,最后一个,因为这将是它的最终值),因为您没有指定实际使用的语言,所以可以解释。

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可能具有,也可能具有任何值。
  • 如果编译器没有严格的规则并且不希望您的代码最终以(看似)随机的方式运行,则会引发诊断并拒绝编译。