関数

11.関数


1.関数とその使い方


何かしらの意味合いを持った処理のカタマリが何度も出てくることが間間あります.
そういう時に便利なのが関数です.
一連の処理の流れを定義してサブルーチン化し,その処理をしたいときは関数名を記述することで使えます.
何度も同じことを書かなくても済んで効率的ですし,関数名を工夫すれば可読性もグンとよくなります.

何らかの複数の変数を受け取り,それらに処理を施し一つの数字を返すという形をとります.
受け取るデータを引数といい,返ってくるデータを返り値といいます.

自分で関数を作ってみましょう.以下の例を見てください.
#include <stdio.h>

int main(void)
{

	printnum(5);

	return 0;
}

void printnum(int a)
{
	printf("%d\n\r", a);
	return;
}

このように、main関数と同じように自分で作る関数を書くことで,関数printnumを作ることが出来ます.
いちいちprintf("%d\n\r")と書くよりも簡潔で,また関数名から数字を表示するという処理の意味も分かりやすくなったと思います.
しかし,このプログラムはこのままでは動きません.

コンパイルは上の行から順番に行われます。
なので、一番最初にprintnumが出てきた時点では、printnumという関数がわからないのです。

これの解決方法は2つ有ります。
  • 解決方法1
#include <stdio.h>

void printnum(int a)
{
	printf("%d\n", a);
	return;
}

int main(void)
{

	printnum(5);
	return 0;
}

  • 解決方法2
#include <stdio.h>

void printnum(int a); //関数のプロトタイプ宣言

int main(void){

	printnum(5);

	return 0;
}

void printnum(int a)
{
	printf("%d\n", a);
	return;
}


解決方法1はmain関数の前で関数を定義してしまうことで解決していますが、
この方法では関数の数が膨大になった時にとっても頭でっかちなプログラムになってしまいます。

そんな時は解決方法2を使います。この方法では関数の存在を前もって定義しています。
このように、予め関数を宣言することを「プロトタイプ宣言」といいます。

解決方法1を使うか2を使うかは宗教ですのでどちらかを進めることはしませんが、
一つのプログラム内では統一すべきです。


2.引数について

以前、関数には引数というものがあると言いましたが、自分で定義した関数はこの引数も自由に設定することが出来ます。
次のプログラムを見てください。
#include <stdio.h>

int max(int a, int b);

int main(void){

	max(5, 10);

	return 0;
}

int max(int a, int b){
	if(a > b){
		printf("%d\n", a);
	}else{
		printf("%d\n", b);
	}
	return 0;
}

引数の宣言は変数の宣言とよく似ていて,上の例のように引数を複数作ることも出来ます.
その場合は,「,(コロン)」で区切ります.

では、引数の受け渡しなどはどのように行われているのでしょうか。
main関数内でmax関数が呼び出されると,それぞれ対応する引数に値がコピーされて,
max関数内の変数であるa,bに値が代入されます.
ここでの話のポイントは「値のコピーである」という点です.

つまり、次のようなプログラムは意図しない動作をします。
#include <stdio.h>

int func(int f_a); //プロトタイプ宣言

int main(void)
{

	int a = 0;

	func(a);

	return 0;
}

int func(int f_a)
{
	f_a = 5;

	return 0;
}

このプログラムはmain関数で宣言した変数aにfunc関数内で5を代入しようとしています.
しかし、このプログラムは意図したとおりには動作しません.
何故ならば、関数funcに渡されたのは変数aの値である0という数字であり,変数aではないからです.
このような使い方はコンパイルエラーにならないエラーなので気をつけましょう.


3.返り値

先ほどのように関数での計算結果を返したいときはどうすればよいでしょうか。
そこで出てくるのが「返り値」というものです.
関数は一つだけ値を返すことが出来ます。次のプログラムを見てください.
#include <stdio.h>

int max(int a, int b); //プロトタイプ宣言

int main(void)
{

	int c = 0;
	
	c = max(5, 10) * 10;
	printf("%d\n", c);

	return 0;
}

/* 大きい方の値を返す関数 */
int max(int a, int b)
{
	if(a > b){
		return a;
	}else{
		return b;
	}
}

関数の返り値は「return」を用いて設定します。そして、関数名の前に付いている型名がその値の型を示します。
返り値を使うときは、変数のように使うことが出来ます。関数の位置に返り値が代入されると思ってください。
何も返さないときは単に「return;」とのみ記述します.



関数のまとめ

関数の構文をまとめると次のようになります。
返り値の型 関数名(引数の型 引数名, …){
	関数の処理;
	…

	return 返り値;
}
最終更新:2017年08月21日 12:23