当我们在此功能中通过价值重新质量时会发生什么



考虑此代码。

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的单独 copies 除了它们以相同的价值开头的事实,

,绝不会互相绑定。

然而,通过逐值 - 归值将值分配给了函数退出时原始变量,这意味着n将对xy的值表示。哪个它首先获得(或更重要的是,因为这将是最终值(开放解释,因为您没有指定实际使用的语言。

此条目上的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。
  • 编译器会提出诊断性并拒绝编译,如果它没有严格的规则,并且不希望您的代码最终以(看似(随机的方式行事。

相关内容

  • 没有找到相关文章

最新更新