考虑此代码。
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
的值?
谢谢
不管它是通用的逐个价值还是逐个价值,那么x
和y
都会成为n
的单独 copies 除了它们以相同的价值开头的事实,
然而,通过逐值 - 归值将值分配给了函数退出时原始变量,这意味着n
将对x
和y
的值表示。哪个它首先获得(或更重要的是,因为这将是最终值(开放解释,因为您没有指定实际使用的语言。
此条目上的Wikipedia页面上有关于这个主题的说法("呼叫复制馆"是您所问的术语更清楚(:
逐回调的语义也与逐个引用的语义不同,其中两个或多个函数参数相互互相互相互相互相。也就是说,指向呼叫者环境中的相同变量。
在逐个引用下,写信给另一个会立即影响另一个;通过给出函数不同的副本来避免通过呼叫填充物避免这种情况,但是将结果在呼叫者的环境中不确定,具体取决于首先复制的哪个别名参数。副本是否会在入口和返回时从左到右订单?
我会希望语言规范将阐明实际的一致行为,以避免您经常在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
可以接受或可能 any, value。 - 编译器会提出诊断性并拒绝编译,如果它没有严格的规则,并且不希望您的代码最终以(看似(随机的方式行事。