8.2.1 按值调用

在 Octave 中,与 Fortran 不同,函数参数是按值传递的,这意味着函数调用中的每个参数都会先被求值,然后赋值到内存中的一个临时位置,最后才传递给函数。目前没有办法指定函数参数应通过引用传递而不是按值传递。这意味着无法直接修改调用函数中某个函数参数的值,被调函数只能改变其函数体内部的局部副本。例如,函数

function f (x, n)
  while (n-- > 0)
    disp (x);
  endwhile
endfunction

会将第一个参数的值显示 n 次。在此函数中,变量 n 被用作临时变量,而无需担心它的值在调用函数中也会被改变。按值传递之所以有用,还因为总是可以为任何函数参数传递常量,而无需先确认该函数不会试图修改参数。

调用者可以使用变量作为参数的表达式,但被调函数并不知道这一点——它只知道参数当时的值。例如,给定一个如下调用的函数:

foo = "bar";
fcn (foo)

你不应该将参数理解为"变量 foo",而应将参数视为字符串值 "bar"

即使 Octave 对函数参数使用按值传递的语义,值也不会被不必要地复制。例如,

x = rand (1000);
f (x);

实际上并不会强制同时存在两个 1000×1000 的元素矩阵,除非函数 f 修改了其参数的值。在这种情况下,Octave 必须创建一个副本,以避免在函数 f 的作用域之外改变该值,或者避免试图修改常量或临时结果的值(这很可能会失败!)。


版权所有 © 2024-2026 Octave中文网

ICP备案/许可证号:黑ICP备2024030411号-2