プログラミング言語の関数について紹介します。
プログラミングでの「関数」はある一連の処理をブロック化し、外部から呼び出しができる仕組みです。サブルーチンとも呼ばれます。
一般的な関数は、複数の引数を与えることができ、関数の結果として戻り値を返すことができます。
戻り値を返さないこともでき、戻り値を返さない関数を「手続き」と呼ぶことがあります。
基本的なプログラミング言語では、関数のないプログラミング言語もあります。先頭から順番に処理を実行します。条件判定文、繰り返し処理やジャンプ命令などで処理が変わります。
10 A=9
20 B=4
30 C=A+B
30 PRINT C
40 IF C > 10 THEN PRINT "10より大きいです"
50 A=2
60 B=6
70 C=A+B
80 PRINT C
90 IF C > 10 THEN PRINT "10より大きいです"
100 END
同じ処理を繰り返し実行できるようにするために、サブルーチンのブロックを呼び出す命令があるプログラミング言語もあります。サブルーチンにはグローバル変数として値を渡す、サブルーチンからの戻り値もグローバル変数で受け取るといった制約のあるプログラミング言語もありますが、同じ処理を繰り返し実行できます。
下記コードでは GOSUB 1000
の命令により 1000
ラインにジャンプして処理を実行し、RETURN
命令で呼び出し元のGOSUB
の次の行にジャンプして処理を実行します。同じ処理をブロックとして記述することができ、プログラム中から繰り返し呼び出せます。
10 A=4
20 B=3
30 GOSUB 1000
40 PRINT "表示しました (1/2)"
50 A=8
60 B=7
70 GOSUB 1000
80 PRINT "表示しました (2/2)"
90 END
1000 C=A+B
1010 PRINT C
1020 IF C > 10 THEN PRINT "10より大きいです"
1030 RETURN
先に紹介した、サブルーチンの機能により、一連の処理を繰り返し呼び出せますが、グローバルな変数を利用して、サブルーチンへの値の受け渡しをすることや、サブルーチンからの戻り値をグローバル変数で受け取る必要があります。
グローバルな変数は状態管理をする必要があり、ほかのロジックでグローバルな変数を変更したり、ネストして呼び出す場合に変数の状態が正しいか把握しておかないと、意図した結果にならないことがあります。
上記の問題点があるため、ブロック化された処理は外部に対して閉じていたほうが不具合を減らせます。関数の機能を使うことで、与える引数や、関数からの戻り値が外部からアクセスできない仕組みになります。
下記のコードはfunc
という関数を定義しています。func
関数は2つの引数(パラメータ)を受け取り、その和が10以上か判定して画面にメッセージを表示する関数です。和が10より大きければ、戻り値は1となり、それ以外(10以下)であれば0を返します。
int func(int av, int bv) {
if (av + bv > 10) {
printf("10より大きいです\r\n");
return 1;
}
else {
printf("10より小さいです\r\n");
return 0;
}
}
int main()
{
int a = 5;
int b = 8;
int c = func(a, b);
int d = 4;
int e = 2;
int f = func(d, e);
char buffer[10];
fgets(buffer, 10, stdin);
return 0;
}
多くの言語では、関数は複数の引数/パラメーターを与えることができ、1つの戻り値を返す動作です。