関数とは、処理の集合です。C言語では、すべてのプログラムは必ず1つ以上の関数が含まれています。
他の関数は、前に記述された関数を呼ぶことで、それに記述された処理を実行することができます。
関数の一般的な書き方は
[戻り値の型] [関数名](仮引数リスト) { // 処理 }
です。型は値の種類を決めるものです。最も有名なものは、整数であることを示すint型です。
戻り値は関数を終えるときに返す値です。次のように, return [値]と書くことで値を返すことができます。
int callee(void) { return 1; } int caller(void) { return callee(); // 関数calleeが返した値をそのまま返す。 }
値を返さないことを示すvoid型以外の場合は必ず値を返さなければなりません。
// これは誤り int incorrect(void) { } // これは正しい int correct_int(void) { return 0; } // これも正しい void correct_void(void) { }
引数は関数に渡す値です。次のように記述します。
int add(int i, int j) { return i + j; } int caller(void) { return add(0, 1); // 関数addに0と1を渡して返ってきたものをそのまま返す }
C言語は必ず関数があり、特に別途定めない限りmain関数から処理が始まります。
main関数の戻り値は、プログラムの処理がmain関数から始まるため、プログラムの終了コード(Exist Code)とも呼ばれます。 処理が成功した場合は0を返す(return 0;)のが慣習となっています。
main関数ですが、ANCI-C規格で書き方が決まっています。(非フリースタンディング環境の場合)
int main() { return 0; } int main(void) { return 0; } int main(int argc, char* argv[]) { // argcとargvを使って何かする. return 0; }
1, 2行目は引数を無視する書き方で、3行目は引数(関数の解説の章で解説します)を受け取るときの書き方です。
というわけでmain関数は上記何れかの書き方で書きましょう、というお話です。
まちがっても
main() { return 0; } void main(void) { // 値を返せ? 知るか. }
などとしてはいけません(前者は古いCの記法、後者は頭がおかしい書き方)。
同じ処理を複数回行う場合, 関数を使ってそれをひとまとめにし、呼び出すことで同じコードの複製を防ぎます。
これを「再利用」とよく呼びます。
他には、まとまった処理を関数に区切っていくことで、コードの見通しを良くし、
今目を向けている部分に集中するできるようにするという使い方もあります。
これらの使い方は「構造化プログラミング」と呼ばれる技法の一部です。
C言語にはその技法を実現するための手段の1つとして関数の仕組みが実装されています。