8

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

所以我有以下伪代码:

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);

我正在努力为即将到来的期末考试抢占先机,这似乎是一个很好的复习问题。Pass-by-name 对我来说绝对是最陌生的。

4

6 回答 6

7

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

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

姓名通行证; 传名

于 2013-04-05T00:25:41.323 回答
2

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

通过引用调用:而不是参数,它们的地址被传递,形式参数指向实际参数。

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

于 2014-12-01T11:17:32.040 回答
1

按价值 - 功能没有变化。功能完成后,您的所有操作都会消失。

通过引用 - 你的行为确实改变了变量。按名字 - 我从来没有听说过......

传递 x+1 并没有改变,只是告诉函数 3 而不是 2 等等...

于 2013-04-05T00:27:34.610 回答
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。

于 2013-04-05T00:23:48.643 回答
0

在 javascript 中:

  1. 原始类型变量(如字符串、数字)始终作为按值传递。
  2. Array 和 Object 根据这些条件作为按引用传递或按值传递传递。

    • 如果您使用新对象或数组更改该对象或数组的值,那么它是按值传递的。

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

    在这里您正在分配新对象或数组。您没有更改旧对象的属性值。所以它是按值传递的。

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

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

    在这里,您正在更改旧对象的属性值。您没有将新对象或数组分配给旧对象。因此它是通过引用传递的。

代码

    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
于 2014-10-28T13:49:57.217 回答
0

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

于 2021-07-28T08:46:55.927 回答