double a[SIZE] = { 52.2, 16.6, 30.3 };に用意されるデータを次のように表示させるプログラムを考えます。 一つの●が10の大きさで、5以上の1の桁は繰り上げて表示しています。
52.2:●●●●● 52.2は、 50.0のデータとして表示しました。 16.6:●● 16.6は、 20.0のデータとして表示しました。 30.3:●●● 30.3は、 30.0のデータとして表示しました。
このプログラムを次のように作りました。
←変更、またはわからない場合にクリックください。
上記の実験で、グローバル変数を安易に使う危険が分かったと思います。
以下で、このようなグローバル変数を排除する考え方を示します。
上記のprint_ maruは、d1の値の情報で表示して、表示に使ったデータをd2へ算出しています。
この場合、print_maru では、d1 が与える情報で、
ここで算出されるd2の値が得られる情報です。
そのイメージを下記に示します。
関数を定義する場合、この与える情報を記憶する変数を宣言し、
得られる情報をreturn の後に表現します。
この得られる情報は、戻り値と呼ばれます。
そして、戻り値のデータ型(int や doubleなど)をvoidの代わりに書きます。
これにより前述のプログラムでは、グローバル変数が少なくなり、次のように簡単になります。
ここで、この与える情報を実引数、
この情報を記憶する変数は仮引数と呼ばれます。
この例では、a[n]が実引数でd1が仮引数です。
関数は、実引数になるデータの値が、仮引数の変数へ
コピーしてから実行が始まります(コピーなので、呼び出し側の変数に影響を与えることはありません。)。
仮引数は実引数で初期化される特別なローカル変数です。
そして、return の後ろに表現される戻り値が関数呼び出しの表記に現れるデータになります。
このデータの種類(データ型)を 関数定義先頭のvoidの代わりに書きます。
(voidは「空」「無」を示す英単語で、void関数は戻り値がない関数を意味します。)
なお、引数が複数ある場合の関数定義では、カッコの中で、 与える順番にコンマで区切って仮引数用の変数を宣言し、 呼び出す実引数は、定義した通りの順番で、記憶可能となるデータの種類で表現しなければなりません。 (そうしないとコンパイルエラーです。)
以上でグローバル変数d1, d2, n が排除できました。 これまで、関数を呼び出す前に、グローバル変数に情報をセットし、関数実行の中でそれを使いました。 この関数に情報を渡す方法が、グローバル変数から引数(ローカル変数)で渡す方法になったわけです。 また関数の中で得られた情報を、呼び出し側で使う場合に戻り値で返すようにしたわけです。 これによりプログラムを関数という短いプログラム単位で考えることができ、より簡単にプログラミングすることができます。