Return文return文(リターンぶん、英: return statement)とは、プログラミング言語における文の一つである。goto文やbreak文、continue文のようなジャンプ文 (jump statement) に分類される。サブルーチンからの復帰に使われ、復帰と同時に値を返すことができる。その値は戻り値(もどりち、英: return value)、返り値(かえりち)、返却値(へんきゃくち)あるいはそのままreturn値(リターンち)などと呼ばれる。 日本産業規格(旧称・日本工業規格)では、C言語の国際標準規格「ISO/IEC 9899:1999」(通称C99)の翻訳「JIS X 3010:2003」およびC++の国際標準規格「ISO/IEC 14882:2003」(通称C++03)の翻訳「JIS X 3014:2003」において、「返却値」という訳語を使用している。 言語によっては、return文ではなくreturn式となっているものもある。 言語別の意味や構文C/C++CおよびC++において、return文とは、関数を実行した結果や、その処理が成功したかどうかなどを示すデータを呼び出し元に渡すとともに、関数を終了させ呼び出し側に制御を戻す働きを持つ文である。return文によって関数の呼び出し元にデータを渡すことを、値を返すと言う。 return文によって返される値の型は、関数の定義時やプロトタイプ宣言時に指定する。例えば、 int f(void);
という宣言は、関数 void g(void);
という宣言は、関数 return文の形式は return 式;
または return ;
のいずれかでなければならない。return文に式が伴う場合、その式の評価結果がreturn文の戻り値となる。C/C++において、構文上はreturn文を省略可能であるが、意味解析の段階において、C99では、式を持つ return文の式が関数の戻り値の型と異なる場合、その値は、関数の戻り値の型を持つオブジェクトへの代入と同じ規則で暗黙的に型変換される[3]。C++の場合、return文は一時オブジェクトの構築とコピーを伴うことがある[2]。 return文に遭遇しないまま関数の終わりまでプログラムが実行された場合、そこに式を省略した 戻り値の型が template<typename T> T
func_call(T fn)
{
return fn();
}
もし、テンプレート引数 //擬似コード
int func_call(int fn())
{
return fn();
}
そして、戻り値の型が //擬似コード
void func_call(void fn())
{
return fn();
}
ここで template<>
void func_call(void (*fn)())
{
fn();
}
一部の古いC++コンパイラでは、void型の式をreturnに書けず、実際にこのような対策を取る必要があった。なお、この特殊化では、関数オブジェクトを対象にしていない。 noreturn属性関数内から例外をスローする、あるいは C++11では、 C11では類似機能として JavaJavaにおいて、return文とは、実行しているメソッドから抜け出すための文である。値を返してメソッドから抜け出す場合には、そのメソッドに適切な戻り値を設定しなければならない。C言語などと同様に、以下の2通りの構文が認められている。
BASICBASIC、あるいはVisual Basicのバージョン6までにおいて、return文とは、 BASICにおけるreturn文には、行番号を伴うものと伴わないものの2つがある。
上のプログラムリストの場合、行番号100から120がサブルーチンになり、行番号10~40はそれぞれサブルーチンへと飛び、行番号120から再びメインルーチンへと帰還する流れをとる。 また、BASICによってはreturn文に行番号を添えることで、メインルーチンへの帰還を行わずにプログラムを走らせることが可能なものもある。
上の例では また、多くのBASICではgosub returnはネストを作ることが可能であり、サブルーチンから更に別のサブルーチンへと飛ばせる。この場合、returnも二重に扱えることとなる。 ほとんどのBASICでは自らのルーチンへと飛ぶことも可能であるため、サブルーチンのネストはバグを生む原因にもなりえる。 関数型言語とreturn関数型プログラミング言語では、関数内で最後に評価される式が戻り値となる。また、 // F#
let f x =
if x > 0.0 then
2.0 * x
else
0.0
Rustのように、 fn f(x: f64) -> f64 {
if x > 0.0 {
2.0 * x
}
else {
0.0
}
}
Swift 5.1以降は、単一の式からなる関数において func f(_ x: Double) -> Double {
x > 0.0 ? 2.0 * x : 0.0
}
Swift 5.9以降はif文のほかにif式[15]もサポートするようになったため、以下の書き方もできるようになっている。 func f(_ x: Double) -> Double {
if x > 0.0 {
2.0 * x
}
else {
0.0
}
}
ラムダ式とreturn文関数型言語およびラムダ式をサポートするほとんどの手続き型言語では、式形式のラムダ[16]を許可する(C++を除く[17])。式形式のラムダでは、値を返すための System.Func<double, double> f = (x) => x * x;
以下のように文形式のラムダを使って書くこともできるが、単純な演算であれば式形式のほうが簡潔になる。 System.Func<double, double> f = (x) => { return x * x; };
C++のラムダ式では、値を返す場合は auto f = [](double x) -> double { return x * x; };
ラムダ式の戻り値の型指定は省略することもでき、ラムダ式の中に auto f = [](double x) {
if (x > 0.0) {
return 2.0 * x;
}
else {
// 0 は int 型のリテラルであり、他の return 文と型が一致しない。
// ラムダ式の戻り値の型を省略するとコンパイルエラーとなる。
return 0;
}
};
PascalISO標準Pascalにはreturn文に直接相当する構文はなく、最も簡潔な代替策はgoto文によるものである。関数の場合、関数と同じ名前の識別子を持つ定義済み変数に結果を代入することで戻り値を設定する。 function FindFirstNegativeElementIndex(a: array of Integer): Integer;
label
100;
var
i: Integer;
begin
for i := Low(a) to High(a) do begin
if a[i] < 0 then begin
FindFirstNegativeElementIndex := i;
goto 100
end
end;
FindFirstNegativeElementIndex := -1;
100:
;
end;
一部の処理系では、特殊変数 function FindFirstNegativeElementIndex(a: array of Integer): Integer;
var
i: Integer;
begin
for i := Low(a) to High(a) do begin
if a[i] < 0 then begin
Exit(i)
end
end;
Exit(-1)
end;
COBOLCOBOLでは、RETURN文はSORT文に関連して、SORTファイルからSORTの後処理(OUTPUT PROCEDURE)へとレコードを返す働きを持つ文となっている。RETURN文は後処理内でREAD文の代わりにSORTファイルからレコードを読む働きを持つ。[19] 脚注注釈出典
参考文献以下の3つは、C/C++の節でのみ参照した。
|
Portal di Ensiklopedia Dunia