法大奥山研究室

 previous  contents

8.2. 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 で指定した変数の型が一致していません。しかしながら,xint 型変数へ変換されるため,エラーはでません。そうであっても,返却値型には char を指定し,return で指定する変数の型と一致させる習慣を先ずは身に付けることを勧めます。

Q 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 を戻す特殊な関数です。これは,プログラムの実行部分という性格を持っているからでしょう。


 previous  contents