mainも関数だった!
今まで使っていた関数について
今回から少し深いところに入っていきます。
この項では関数について詳しく話そうと思います。
今までprintfやscanfなどのもともと用意されていた関数は使っていましたね。これらをライブラリ関数といいます。
しかし、すべての機能がライブラリ関数になっているわけではありません。関数を自分で作成していかなければなりません。
実はすでに今までのコーディングで関数を作成していたのですよ。それがmain関数です。
main関数について少し説明すると、C言語では1つmain関数がないとエラーになります。
また、コンピュータがmainを呼ぶことで処理が実行されます。
関数定義
関数はどのように定義するのか見てみましょう。
このような要素で構成されています。1つずつ見ていきましょう。
戻り値型(返却値型): 関数の処理が終了したときにこの関数が返す値の型を指定します。
関数名 : 関数を呼び出すときの名前
仮引数 : 関数呼び出し時に渡される。実引数を受け取るための変数を指定します。
関数の本体には実際の処理を記述します。それでは実際のソースコードを見てみましょう。
関数サンプル
/* 関数の計算結果を表示させる */
#include<stdio.h>
int func( int X )
{
X *= 10;
return X;
}
/* メイン関数 */
int main( void )
{
int na; // 戻り値格納用
na = func( 5 );
/* 結果表示 */
printf( "%d\n", na );
return(0);
}
今回はmainに加えて自作のfuncという関数を用意しました。
コメントにある通りfunc関数に数値を渡して計算結果を戻り値としてもらって来ています。
詳しい説明は後ほど図解で行います。結果は以下のように計算結果が表示されます。
実行結果
自作した関数もライブラリ関数と同じように呼び出して引数を与える形で使用します。
実際にどういう流れで実行されるのか図でご覧ください
この図を番号順に見て行きましょう。まずfuncが呼び出され、5が実引数として関数に渡されます。
図に書いてある通り、仮引数のXに5が代入されているイメージだと理解しやすいです。
次に5に10を乗算するコードが実行されてXは50になります。関数内での実行を完了したのでXの50を戻り値として返ってきます。
その戻り値がmainのnaに格納され結果表示に進むという流れになります。
このように計算の公式等を関数化すると同じコードを何度も書くことなく使いまわせるので、積極的に関数化して行きましょう。
return文
mainにもfuncにも最後は必ず記述してあるreturnはどのような処理をしているか気になりませんか?
これはreturn文と言って関数を終了し、その関数が呼び出された位置に戻ります。
return文
/* 戻り値がある場合 */
return 式;
/* 戻り値がない場合 */
return;
書き方は2種類あり戻り値の有無で決まります。実は関数は必ずしも戻り値を返す必要はないんです。
ですので、戻り値が必要ない場合は式を省略することができるのです。
引数についての補足
今回作成したfunc関数では仮引数は1つでしたが、複数の仮引数を宣言することも可能です。
簡単に書き方の紹介をしておきます。複数の仮引数がある場合は実引数も同じ数だけ指定してくださいね。
例
/* 関数 */
int func( int X, int Y )
{
return ( X + Y );
}
/* 呼出し */
na = func( na, nb );
次に実引数に関数呼び出しを書いた場合の動作についてです。
例
printf( "大きい方の値は%dです\n", maxof( na, nb ) );
例として、maxofという2値を比較して大きい方を戻り値として返す関数をprintfの実引数として書いてみました。
実行される順序は、まずmaxofが呼ばれ実行されます。次にその戻り値がprintfで出力される流れになります。
この順序は他の関数でも同様です。
仮引数や戻り値がない関数の場合
仮引数や戻り値を必要としない関数を作成する場合はvoid型を指定します。
void型は型のない型と覚えてもらえればいいと思います。
この型を指定した場合は、戻り値として変数などに代入することができません。
例
void func( int A )
{
printf( "%d\n", A );
return;
}
na = func( 100 ); /* 戻り値がないのでエラーになる */
以上のことに頭に入れつつ、関数を組んで行きましょう。
最終更新:2013年01月10日 00:14