按引用,值和名称调用

时间:2013-04-05 00:15:25

标签: pass-by-reference pass-by-value pass-by-name

我试图理解按引用,值和名称调用之间的概念差异。

所以我有以下伪代码:

foo(a, b, c)
{
   b =b++;
   a = a++;
   c = a + b*10
}

X=1;
Y=2;
Z=3;
foo(X, Y+2, Z);

如果a,b和c都是通过引用调用的话,foo调用后的X,Y和Z是什么? 如果a,b和c是按值调用/结果? 如果a,b和c是名字?

另一种情况:

X=1;
Y=2;
Z=3;
foo(X, Y+2, X);

我正在努力开始研究即将到来的决赛,这似乎是一个很好的评论问题。名字传递对我来说绝对是最陌生的。

6 个答案:

答案 0 :(得分:5)

当您按值传递参数时,它只是复制函数参数中的值,并且函数中对该变量所做的任何事情都不会反映原始变量,例如。

foo(a, b, c)
{
   b =b++;
   a = a++;
   c = a + b*10
}

X=1;
Y=2;
Z=3;
foo(X, Y+2, Z);
//printing will print the unchanged values because variables were sent by value so any //changes made to the variables in foo doesn't affect the original.
print X; //prints 1
print Y; //prints 2
print Z; //prints 3

但是当我们通过引用发送参数时,它会复制变量的地址,这意味着无论我们对函数中的变量做什么,实际上都是在原始内存位置完成的,例如。

foo(a, b, c)
{
   b =b++;
   a = a++;
   c = a + b*10
}

X=1;
Y=2;
Z=3;
foo(X, Y+2, Z);

print X; //prints 2
print Y; //prints 5
print Z; //prints 52

通过名字传递; Pass-by-name

答案 1 :(得分:2)

按值调用:正常方式...将实际参数的值复制到形式参数中。

按引用调用:代替参数,传递地址,形式参数指向实际参数。

按名称调用:与宏一样,整个函数定义替换函数调用,形式参数只是实际参数的另一个名称。

答案 2 :(得分:1)

按价值 - 功能没有变化。当函数完成时,你的所有动作都会消失。

通过引用 - 您的行为确实会改变变量。 通过名字 - 我从未听说过......

传递x + 1不会改变,只是告诉功能3而不是2等......

答案 3 :(得分:0)

如果它是值传递,则不会更改X,Y或Z的值。当你使用诸如“foo()”之类的函数时,它基本上将变量(x,y和z)复制到其他变量(a,b和c)中,并使用它们执行某些操作,而不更改原件(x, y和z)。要更改值,您必须返回一个值,如下所示:

foo(a, b, c)
{
a = a++;
b = b++;
c = a + b * 10;
return c;
}

x = 1;
y = 2;
z = 3;
z = foo(x, y+2)

然后x和y将是相同的,但是z将是(x + 1)+(y + 1)* 10,在这种情况下将是32。

答案 4 :(得分:0)

在javascript中:

  1. 基本类型变量,如string,number始终作为pass传递 按价值计算。
  2. Array和Object作为传递引用传递,或者根据这些条件传递值。

    • 如果要使用新的Object或Array更改该Object或数组的值,则它将通过Value传递。

      object1 = {item: "car"}; array1=[1,2,3];

    这里你要分配新的对象或数组。你没有改变属性的值 旧的对象。所以它是通过价值。

    • 如果要更改对象或数组的属性值,则它将通过引用传递。

      object1.item= "car"; array1[0]=9;

    这里你要更改旧对象的属性值。你没有将新对象或数组分配给旧对象。所以它是通过引用传递的。

  3. <强>代码

        function passVar(object1, object2, number1) {
    
            object1.key1= "laptop";
            object2 = {
                key2: "computer"
            };
            number1 = number1 + 1;
        }
    
        var object1 = {
            key1: "car"
        };
        var object2 = {
            key2: "bike"
        };
        var number1 = 10;
    
        passVar(object1, object2, number1);
        console.log(object1.key1);
        console.log(object2.key2);
        console.log(number1);
    
    Output: -
        laptop
        bike
        10
    

答案 5 :(得分:0)

按值调用中,传递变量的副本,而在按引用调用中,传递的是变量本身。在值调用中,实际和形式参数将在不同的内存位置创建,而在引用调用中,实际和形式参数将在相同的内存位置创建。< /p>