8.2.1 Call by Value

Last-modified: 2025-03-03 (月) 20:27:55

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

関数が引数の値を変更しない限り、実際には 2 つの 1000 x 1000 要素の行列が存在するように強制されるわけではありません 。その場合、関数のスコープ外で値を変更したり、定数の値や一時的な結果の値を変更しようとしたり (おそらく失敗するでしょう) しないように、Octave はコピーを作成する必要があります。 ff