return
文 返却値の指定には return
文を使います。
■return
文
return 式;
return
文に出会うと,関数内の処理はそこで止まり,呼び出し元に処理は戻されます。return
文は複数存在しても構いません。[C99, 6.8.6.4, 2] return
文を使う際には,返却値型が void
のときには return
に 式
を指定しないこと,逆に返却値型が void
以外の場合には return
に 式
を指定する必要があることに注意します。[C99, 6.8.6.4, 1]
例えば,
double f(int x, int y) { // 処理 return; }
というのは駄目です。返却値型が double
ですから,return
に何かしらの式を指定します。また,
void f(int x, int y) { return x + y; }
というのも駄目です。返却値型が void
だからです。
return
に指定する 式
には,返却値型と同じ型の値を出す式を入れます。もし返却値型と異なる型の変数や値を指定した場合,返却値型に変換されます。[C99, 6.8.6.4, 3] 例えば,式
に 1
を入れたとします。返却値型が int
ならば,int
型の 1
を返します。返却値型が double
の場合,double
型の 1
を返します。
異なる型の変数を return
に指定することはできますが,返す変数の型と従属変数の型を一致させるように心掛けることを勧めます。例えば,次のケースを見ましょう。
int f (void) { char x = 'a'; return x; }
返却値型を int
としたにもかからず,return
には char x = 'a';
と定義した x
を指定しています。つまり,従属変数の型と return
で指定した変数の型が一致していません。しかしながら,x
は int
型変数へ変換されるため,エラーはでません。そうであっても,返却値型には char
を指定し,return
で指定する変数の型と一致させる習慣を先ずは身に付けることを勧めます。
main
関数の仮引数と返却値
仕様(C99)によると,main
関数は,次のいずれかに限る。(但し,後者については,それと同値の形を許す。後者については,後出。)
int main(void) { /* ... */ }
従属変数が
int main(int argc, char *argv[]) { /* ... */ }
int
型ということは,返却値に何か整数を指定するのでしょうか。main
関数の戻りについて,国際規格の C99では次のように述べています。[C99 5.1.2.2.3]
If the return type of the main function is a type compatible with int, a return from the initial call to the main function is equivalent with the exit function with the value returned by the main function as its argument; reaching the } that terminates the main function returns a value of 0.
先ず,exit
関数ですが,これはヘッダファイル stdlib.h
に入っている標準ライブラリ関数です。exit
関数は,ヘッダファイル stdlib.h
に入っている標準ライブラリ関数 atexit
関数で指定した関数を実行し,バッファされているデータをフラッシュしてプログラムを正常終了させます。exit
関数の引数に 0
或いは EXIT_SUCCESS
を指定すると,処理系に依存した形で成功終了を戻します。
さて,main
関数からの戻りですが,もし戻り値の型が int
型ならば,戻り値として指定しようとしている整数をその exit
関数に代入したのと同値であり,return
を入れずに }
に至ると,main
関数は 0
を返すとなっています。C99によると main
関数は,return
を使わずとも 0
を戻す特殊な関数です。これは,プログラムの実行部分という性格を持っているからでしょう。