return文
return文(リターンぶん、英: return statement)とは、プログラミング言語における文の一つである。goto文やbreak文、continue文のようなジャンプ文 (jump statement) に分類される。サブルーチンからの復帰に使われ、復帰と同時に値を返すことができる。その値は戻り値(もどりち、英: return value)、返り値(かえりち)、返却値(へんきゃくち)あるいはそのままreturn値(リターンち)などと呼ばれる。
言語別の意味や構文[編集]
C/C++[編集]
CおよびC++において、return文とは、関数を実行した結果や、その処理が成功したかどうか等を示すデータを呼び出し元に渡すとともに、関数を終了させ呼び出し側に制御を戻す働きを持つ文である。return文によって関数の呼び出し元にデータを渡すことを、値を返すと言う。
return文によって返される値の型は、関数の定義時やプロトタイプ宣言時に指定する。例えば、
int f();
という宣言は、関数 f()
が int
型の値を返すことを表す。
return文の形式は
return 式;
または
return ;
のいずれかでなければならない。return文に式が伴う場合、その式の評価結果がreturn文の戻り値となる。この式は構文上省略可能であるが、意味解析の段階において、C99及びC++98では、戻り値の型がvoid(値を返さない)と定義されている場合を除いて式の省略はできない(C++では挙動が不定)と定められている(X3010 105頁 6.8.6.4、79頁6.6.3 2節参照)。
return文の式では、その式の結果の型が関数の戻り値の型へ暗黙的に変換できなければならない(X3010 105頁 6.8.6.4、79頁6.6.3 2節参照)。
return文に遭遇しないまま関数の終わりまでプログラムが実行された場合、そこに式を省略した return;
が行われたと見なされる。ただし、C99とC++98では、main関数に限り、そのmain関数の戻り値の型が int
であれば return 0;
があったと見なされる(X3010 9頁 5.1.2.2.3、X3014 35頁 3.6.1 5節参照)
戻り値の型が void
である関数で式を指定することは、Cだと意味解析でできないとされているが、現在のC++では、結果がvoid型になる式であれば良いとされている(X3014 79頁 6.6.3 3節参照)。このためテンプレートでより汎用性を持たせることが可能になっている。
template<typename T> T
func_call(T fn)
{
return fn();
}
もし、テンプレート引数 T
にint型を返す関数を与えてこの関数テンプレートfunc_callを実体化させると、概念的には次のようになる。
//擬似コード
int func_call(int fn())
{
return fn();
}
そして、戻り値の型が void
の関数を与えると、やはり概念的には次のようになる。
//擬似コード
void func_call(void fn())
{
return fn();
}
ここで fn()
の型は void
になるが、func_call
の戻り値の型も void
であるため、もとの関数テンプレート func_call
に戻り値の型が void
の関数を与えてもコンパイル可能である。仮にこれが認められず、Cのように戻り値の型も void
の関数内では、式を省略したreturn文しか許されないとすると、もとの func_call
に対して次のような特殊化を用意しなければならない。
template<>
void func_call(void (*fn)())
{
fn();
}
一部の古いC++コンパイラでは、void型の式をreturnに書けず、実際にこのような対策を取る必要があった。なお、この特殊化では、関数オブジェクトを対象にしていない。
Java[編集]
Javaにおいて、return文とは、実行しているメソッドから抜け出すための文である。値を返してメソッドから抜け出す場合には、そのメソッドに適切な戻り値を設定しなければならない。C言語などと同様に、以下の2通りの構文が認められている。
- 構文1
return ;
- 構文2
return 式;
void
を使って宣言されたメソッドや、コンストラクタ、ラムダ式など[1]、メソッドの戻り値が無い(値を返さない)場合は構文1を用い、返す場合は構文2を用いる。構文1は省略可能であり、処理がメソッド末尾に到達した場合、暗黙的に呼び出し元へ制御が戻る。
BASIC[編集]
BASIC、あるいはVisual Basicのバージョン6までにおいて、return文とは、gosub
によって飛んだサブルーチンから、元のメインルーチンへと戻る命令である。gosub元の行番号、もしくは構文の位置を記憶しておき、return
と書かれた個所までプログラムの進行が辿り着くと、記憶していた次の命令もしくは行番号を読み、実行を続けていく。
BASICにおけるreturn文には、行番号を伴うものと伴わないものの2つがある。
- 構文1
return
- 例
10 a=1:gosub 100 20 a=2:gosub 100 30 a=3:gosub 100 40 a=4:gosub 100 50 end 100 'サブルーチン 110 print a 120 return
上のプログラムリストの場合、行番号100から120がサブルーチンになり、行番号10~40はそれぞれサブルーチンへと飛び、行番号120から再びメインルーチンへと帰還する流れをとる。
また、BASICによってはreturn文に行番号を添えることで、メインルーチンへの帰還を行わずにプログラムを走らせることが可能なものもある。
- 構文2
return 行番号
- 例
10 a=1:gosub 100 20 a=2:gosub 100 30 a=3:gosub 100 40 a=4:gosub 100 50 end 100 'サブルーチン 110 print a 120 if a<3 then return 130 if a>=3 then return 150 150 'サブルーチンからの離脱 160 print "end" 170 end
上の例では a
の値として 3
が代入された行番号30からのサブルーチンへのジャンプ以降は、行番号130の return 150
によってルーチンから解放され、行番号150へと飛ぶ。既にreturnを経ているため、仮にこの後にreturn文があっても行番号40に戻ることは二度と無く、エラーを返すこととなる。
また、多くのBASICではgosub returnはネストを作ることが可能であり、サブルーチンから更に別のサブルーチンへと飛ばせる。この場合、returnも二重に扱えることとなる。
殆どのBASICでは自らのルーチンへと飛ぶことも可能であるため、サブルーチンのネストはバグを生む原因にもなりえる。
脚注[編集]
参考文献[編集]
以下の3つは、C/C++の節でのみ参照した。
- 『JIS X 3010:2003 プログラム言語C』 105頁(6.8.6.4 return文)ほか。
- 『JIS X 3014:2003 プログラム言語C++』 79頁(6.6.3 return文)ほか。
- 平林雅英 『ANSI C言語辞典』技術評論社、1989年(初版)、189頁(return文)。