对一个非常简单的程序感到困惑

时间:2014-08-15 04:16:16

标签: parameter-passing pass-by-reference pass-by-value

我有这个问题:

enter image description here

该计划非常简单:

sub(b, a) 

<=>

sub(x, y) 
x = x + y = 3 + 2 = 5 
y = x + y = 5 + 2 = 7 

<=> 
b = 5
a = 7 

因此 d 是正确答案

但给出的答案是 c (a = 7,b = 3)

为什么呢?我在这里失踪了什么?

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

请注意,“参数x按值调用,参数y通过引用调用”。

因此,{em>值传递b,这意味着x内的sub只是一个局部变量 - 它不指向同一位置b

因此,对x内的sub所做的更改不会影响传入的变量b

引用传递的y对比,这意味着ya实际上是同一个变量,因此更改为{{1} } y内部sub反映在其中。

答案 1 :(得分:1)

这里的技巧是传值和传递参考之间的区别。因为提示注释x按值传递(或“调用”)。这意味着当您将b传递给sub作为x时,x仅包含b的文字值。从实际角度来看,这意味着对x中的sub所做的任何更改会影响主程序中的b

另一方面,由于y是通过引用传递的,当您将a传递给sub y时,y实际上是引用到变量ay“指向”a)。这意味着,如果您对y 中的sub进行了更改,则这些更改会影响主程序中的 a

如果以上内容让您感到困惑,请以这种方式考虑:如果变量通过值传递给函数,则可以将参数名称(x)替换为值3)。如果通过引用函数传递变量,则可以将其视为将参数名称(y)替换为参数(a)的变量名称

考虑到这一点,让我们重温一下这个问题:

a = 2;
b = 3;

sub(b, a);

----------

x = x + y

(在此行中x代表b,即3,因此值x(但不是b {1}})现在是5

y = x + y

(在此行y代表实际变量 a,其值为3.当我们将x添加到y时, ,实际更改 a。因此,此行后ya的值均为7)     返回;

正如您所看到的,b无法在原始函数中更改,因此其最终值只能是3。但是a可以更改,并且由于sub中的操作现在具有7的值。

我希望这能解决你在解决这个问题时遇到的任何困惑。