【问题标题】:Pass-by-name and Pass-by-value-result按名称传递和按值传递结果
【发布时间】:2012-03-31 17:23:24
【问题描述】:

对于我的编程语言课程,我试图了解 pass-by-name 和 pass-by-value-result 的工作原理。我意识到这些在主流语言中几乎没有使用,但我想了解它们是如何工作的。举个例子(语言无关):

void swap(int a, int b){
    int t;
    t = a;
    a = b;
    b = t;
}
void main() {
    int val = 1, list[5] = {1, 2, 3, 4, 5}
    swap(val, list[val]); 
}

在为 pass-by-value-result 和 pass-by-name 调用 swap 之后 val 和 list 的值会是什么。

解释也很好。

根据我的推断,它得到了 value-result: val=2, list={1,1,3,4,5} 和 name: val=3, list={1,2,1,4,5 }。我对这些结果非常不确定。

当传递一个数组而不是单个 int 时,它是否也改变了这两种方法的工作方式?提前感谢您的帮助。

【问题讨论】:

    标签: parameter-passing pass-by-name


    【解决方案1】:

    如果您的意思是按名称传递作为按引用传递,那么结果将与按值传递相同。
    这是因为您只是在 val 和列表位置 val 之间切换引用。您没有传递数组引用。 将 var 视为指向包含值的内存块的指针。

    【讨论】:

      【解决方案2】:

      这段代码解释了名字传递的问题之一 这就是为什么

      在交换中会发生这种情况

      void swap(int a, int b){
          int t;
          t = a; //t=val; t=1
          a = b;// val=list[val]; val=list[1]=2
          b = t;// list[val]=t; list[2]=1
      }
      void main() {
          int val = 1, list[5] = {1, 2, 3, 4, 5}
          swap(val, list[val]); 
      }
      

      您可以看到 val=list[val] 处的 val 发生了变化,它不再是您传递的那个 val

      至于传值结果

      void swap(int a=1, int b=2){
          int t;
          t = a; //a=1 so t=1
          a = b; //b=2 so a=2
          b = t; //b=1 so it and it return the right parameter so list[1]=2
      }
      

      希望对你有帮助

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-27
        • 2017-01-19
        • 2014-04-14
        • 1970-01-01
        • 2023-03-17
        • 1970-01-01
        • 2014-08-23
        • 2015-05-23
        相关资源
        最近更新 更多