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

What happens when we pass-by-value-result in this function?

考虑这段代码。

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

如果我们假设该语言支持按值传递结果,答案是什么?据我所知,按值传递结果复制进出。但是我不确定当 n 被复制到两个不同的形式参数时,它的值是多少。 xy 应该像引用一样吗?或者 n 是否应该根据最后复制的内容获取 xy 的值?

谢谢

不管是普通传值还是传值结果,那么xy就变成了 n,除了它们以相同的值开头之外,它们之间没有任何联系。

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

The Wikipedia page on this entry 关于这个主题有话要说(“call-by-copy-restore”是您所问问题的术语,我已经强调了重要的一点并解释为更清晰):

The semantics of call-by-copy-restore also differ from those of call-by-reference where two or more function arguments alias one another; that is, point to the same variable in the caller's environment.

Under call-by-reference, writing to one will affect the other immediately; call-by-copy-restore avoids this by giving the function distinct copies, but leaves the result in the caller's environment undefined depending on which of the aliased arguments is copied back first. Will the copies be made in left-to-right order both on entry and on return?

希望语言规范会阐明实际一致的行为,以避免您在 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 可能会采取任何一个,或者可能 任何, 值。
  • 编译器提出诊断并拒绝编译,如果它没有严格的规则并且不希望您的代码以(看似)随机的方式结束。