関数
前回、関数の基本的なことに関して説明しました。
今回はそのほかのルールに関してみてきましょう。
関数の宣言順序
前回作成したプログラムのmain関数の位置とpower関数の位置を入れ替えてみてください。
環境によっては警告がでます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #include <stdio.h> int main( void ){ int num; num = power(2,10); printf ( "2のは%dですn" , num); return (0); } int power( const int base, const int exponent) { int i; int result = 1; for (i = 0; i < exponent; i++){ result *= base; } return (result); } |
main関数側でpowerを呼び出そうとした際に、powerがどういった型の関数なのかが
わかりません。
そこで帰り値の型が不明ということでint型と判断しますといった警告が環境によっては出てきます。
今回はもともとint型になっているので特に問題ありませんが、double型を返す関数だった場合は、
警告ではなくエラーとなってしまいます。
ためしに戻り値の型をdouble型に変更してみてください。エラーが出ると思います。
1 2 3 4 5 6 7 8 9 | double power( const int base, const int exponent) { int i; int result = 1; for (i = 0; i < exponent; i++){ result *= base; } return (result); } |
mainで呼ばれているpower関数は戻り値int型の関数と勝手にみなされているので再度同じ名前でdouble型の関数を
定義しているという判断をコンパイラは下してしまいます。
そこでその関数が登場するよりも上の位置で関数の定義を行う必要があります。
この方法ではmainより上の方に関数をすべて用意する必要があります。しかし大きなプログラムとなって自作の関数から
また別の自作関数を呼び出すようなケースが出てきた場合、うまく呼び出せなくなる可能性があります。
例えばある関数Aは関数Bを内部で使用していて、関数Bは関数Cを使用する必要があります。
さらに関数Cの内部でAを必要としたとき、どれを上に書いてもコンパイル時に警告もしくはエラーとなって
しまいます。
それを回避するために関数の定義だけを上に記述して実装部分は下の方に記述するという方法があります。
これを関数のプロトタイプといいます。
プロトタイプ宣言の方法
関数のプロトタイプというのは実装部分はそこでは記述せずに、戻り値の型と関数名、引数の型 引数名だけを
指定しておきます。以下のような形となります。
1 | 戻り値の型 関数の名前( 引数の型 引数名 ); |
こうすることで関数を呼び出す時にコンパイラが戻り値の型チェックや引数の型チェックを
行ってくれるようになります。
あくまで型や引数の型チェックとして使用されるので引数名を省略することができますが、
引数の名前から意味が理解しやすいということで記述されていることの方が多いと思います。
この関数のプロトタイプはその関数を使用するより前(ソースコードの上)に
記述する必要があります。
今までのコードで使用していた「stdio.h」も関数のプロトタイプの集合となっています。
それをソースの先頭で読み込んでいるのでprintfなどがコンパイルの際に
型チェックされるということになります。
関数のプロトタイプ宣言
では先ほどのコードをプロトタイプ宣言を使用して書き換えてみましょう。
2行目がプロトタイプ宣言です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #include <stdio.h> int power( const int base, const int exponent); int main( void ){ int num; num = power(2,10); printf ( "2のは%dですn" , num); return (0); } int power( const int base, const int exponent) { int i; int result = 1; for (i = 0; i < exponent; i++){ result *= base; } return (result); } |
このように関数を作成する場合は、その宣言位置やプロトタイプ宣言などに気を付ける
必要があります。
実践力が身につくC言語講座 連載リンク
競技プログラミングをイメージしたライブラリ活用講座
競技プログラミング風-標準Cライブラリ入門 連載
アルゴリズムをマスターして技術力アップ!
実践アルゴリズム講座 連載
パズルゲームの解析をテーマにしたC++講座
ゲーム解析プログラミング 連載