1

假设我有一个整数数组 a

a[0] = 1
a[1] = 2
a[2] = 3

和没有特定语言的功能

func swap(int l, int r){
  int temp = l;
  l = r;
  r = temp;
}

如果我执行,我的数组 a 的最终值是多少

int i = 1;
swap(i,a[i]);

在按值调用、按引用调用和按名称调用?

我认为按值调用会给我相同的整数数组 a = [1,2,3] 因为函数内的更改对传入的参数没有影响。

并且通过引用调用会给我结果a = [1,1,3],那么按名称调用呢?你能告诉我评估的步骤吗,我只知道到目前为止它会将 i 和 a[i] 直接传递到函数调用中,但不知道会受到什么影响。

编辑:我误读了问题,数组 a应该是a = [1,2,3]最初而不是a= [10,20,30]

4

1 回答 1

1

我不知道自 Algol 60 以来有任何语言实现了“按名称调用”(可能还有那个时代的一些紧密派生词)。

但是在纸上弄清楚的方法是:

(1) 写出'swap'的文字。

(2) 用实际参数“i”替换每次出现的形式参数“l”。

(3) 用实际参数“a[i]”替换每次出现的形式参数“r”。

(4) 评估结果代码。

(如果存在名称冲突,这将需要更多解释,但没有)

步骤 1 到 3 为您提供此代码,并在评估中添加了注释。

  int temp = i;  // temp = 1
  i = a[i];      // i = a[1] = 20
  a[i] = temp;   // a[20] = 1

最后一行看起来像是违反了数组边界。

this 和按引用的情况之间的区别在于:使用按引用,因为a[i]我们在调用之前确定实际参数是a[1],并将引用传递给该单个元素。更改iafter 的值不会影响引用的内容。但是对于按名称调用,每次使用参数时都会重新计算参数所指的内容,因此它总是取决于当时的值i

(在实现上,参数a[i]作为指向一小段代码的指针传递——称为“thunk”——它将计算 的地址a[i]

于 2020-06-01T02:17:55.943 回答