当我们在这个函数中传递值结果时会发生什么?

问题描述 投票:1回答:1

考虑这段代码。

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

如果我们假设语言支持按值传递结果,那么答案是什么?据我所知,pass-by-value-result副本进出。但我不确定将n复制到两个不同的形式参数时会有什么价值。 xy应该像参考吗?或者n应该获得xy的值,具体取决于最后复制的值?

谢谢

pass-by-reference pass-by-value call-by-value
1个回答
2
投票

无论它是常见的值传递还是值传递值,xy都会成为n的独立副本,它们绝不会相互联系,除非它们以相同的值开头。

但是,按值传递将值返回到函数退出时的原始变量,这意味着n将采用xy的值。它首先获得哪一个(或者更重要的是,最后一个,因为它将是它的最终值),因为您没有指定实际使用的语言,因此可以解释。

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可能会采取任何或可能的任何价值。
  • 编译器引发诊断并拒绝编译,如果它没有严格的规则,并且不希望您的代码最终以(看似)随机的方式运行。
© www.soinside.com 2019 - 2024. All rights reserved.