削除された内容 追加された内容
Askjyck (会話) による ID:62077268 の版を取り消し rvv]
m編集の要約なし
1行目:
{{小文字}}
'''return文'''(リターンぶん、{{lang-en-short|return statement}})とは、[[プログラミング言語]]における[[文 (プログラミング)|文]]の一つである。[[goto文]]や[[break文]]、[[continue文]]のようなジャンプ文 ({{en|jump statement}}) に分類される。[[サブルーチン]]からの復帰に使われ、復帰と同時に[[値 (情報工学)|値]]を返すことができる。その値は'''戻り値'''(もどりち、{{lang-en-short|return value}}または'''返り値'''(かえりち)、'''返却値'''(へんきゃくち)あるいはそのまま'''return値'''(リターンち)などと呼ばれる。
 
== 言語別の意味や構文 ==
=== C/C++ ===
[[C言語|C]]及び[[C++]]に於いて、return文とは、[[関数 (プログラミング)|関数]]を実行した結果や、その処理が成功したかどうか等を示すデータを呼び出し元に渡すと共に、その関数を終了させるはたら呼び出し側に制御を戻す働きを持つ[[文 (プログラミング)|文]]である。return文によって関数の呼び出し元にデータを渡すことを、'''値を返す'''と言う。
 
return文によって返される値の[[データ型|型]]は、関数の定義時や[[プロトタイプ宣言]]時に指定する。例えば、
<syntaxhighlight lang="c">
int f();
</syntaxhighlight>
という宣言は、関数 <code>f()</code> が <code>int</code> 型の値を返すことを表す。
 
return 文の形;
int main(void)
:<span style="font-family:serif">return ''式'' ;</span>
 
または
という宣言は、int型の値を返すことを表す。
:<span style="font-family:serif">return ;</span>
 
のいずれかでなければならない。return文式が伴う場合その式の評価結果がreturn文の戻り値を指定すとなる。この式は構文上省略可能であるが、[[意味解析]]の段階において、[[C99]]及びC++98では、戻り値の型が[[void (コンピュータ)|void]](値を返さない)と定義されている場合を除いて、式の省略はできない(C++では挙動が不定)と定められている(X3010 105頁 6.8.6.4、79頁6.6.3 2節参照)。
return文は、以下の様に書く。
return 式;
式には、戻り値を指定する。この式は、構文上省略可能であるが、[[意味解析]]の段階において、[[C99]]及びC++98では、戻り値の型が[[void (コンピュータ)|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文に遭遇しないまま関数の終わりまでプログラムが実行された場合、そこに式を省略した <code>return;</code> が行われたと見なされる。ただし、C99とC++98では、[[エントリーポイント|main関数]]に限り、そのmain関数の戻り値の型が <code>int</code> であれば <code>return 0;</code> があったと見なされる(X3010 9頁 5.1.2.2.3、X3014 35頁 3.6.1 5節参照)
 
戻り値の型が <code>void</code> である関数で式を指定することは、Cだと意味解析でできないとされているが、現在のC++では、結果がvoid型になる式であれば良いとされている(X3014 79頁 6.6.3 3節参照)。このため[[テンプレート (プログラミング)|テンプレート]]でより汎用性を持たせることが可能になっている。
<syntaxhighlight lang="C++">
template<typename T> T func_call(T fn)
{
returnfunc_call(T fn();
{
}
もし、テンプレート引数Tにint型を返す関数を与えてこの関数テンプレートfunc_callを実体化させると、概念的には次のようになる。
//擬似コード
int func_call(int fn())
{
return fn();
}
</syntaxhighlight>
そして、戻り値の型がvoid型の関数を与えると、やはり概念的には次のようになる。
もし、テンプレート引数 <code>T</code> にint型を返す関数を与えてこの関数テンプレートfunc_callを実体化させると、概念的には次のようになる。
//擬似コード
<syntaxhighlight lang="C++">
void func_call(void fn())
//擬似コード
{
int returnfunc_call(int fn();)
{
}
return fn();
ここでfn()の型はvoid型になるが、func_callの戻り値の型もvoidであるため、基の関数テンプレートfunc_callに戻り値の型がvoid型の関数を与えてもコンパイル可能である。仮にこれが認められず、Cのように戻り値の型もvoidの関数内では、式を省略したreturn文しか許されないとすると、基のfunc_callに対して次のような[[テンプレートの部分特殊化|特殊化]]を用意しなければならない。
}
template<>
</syntaxhighlight>
void func_call(void (*fn)())
そして、戻り値の型が <code>void</code> の関数を与えると、やはり概念的には次のようになる。
{
<syntaxhighlight lang="C++">
fn();
//擬似コード
}
intvoid func_call(intvoid fn())
{
return fn();
}
</syntaxhighlight>
ここで <code>fn()</code> の型は <code>void</code> になるが、<code>func_call</code> の戻り値の型も <code>void</code> であるため、もとの関数テンプレート <code>func_call</code> に戻り値の型が <code>void</code> の関数を与えてもコンパイル可能である。仮にこれが認められず、Cのように戻り値の型も <code>void</code> の関数内では、式を省略したreturn文しか許されないとすると、もと <code>func_call</code> に対して次のような[[テンプレートの部分特殊化|特殊化]]を用意しなければならない。
<syntaxhighlight lang="C++">
template<>
void func_call(void (*fn)())
{
fn();
}
</syntaxhighlight>
一部の古いC++コンパイラでは、void型の式をreturnに書けず、実際にこのような対策を取る必要があった。なお、この特殊化では、関数オブジェクトを対象にしていない。
 
=== Java ===
[[Java]]に於いて、return文とは、実行している[[メソッド]]から抜け出すための文である。値を返してメソッドから抜け出す場合には、そのメソッドに適切な戻り値を設定しなければならない。C言語などと同様に、以下の2通りの構文が認められている
 
# <span style="font-family:serif">return ;</span>
==== 構文1 ====
# <prespan style="font-family:serif">return ''値'' ;</prespan>
==== 構文2 ====
<pre>return 値;</pre>
 
[[メソッド]]の戻り値が無い(値を返さない)場合は構文1を用い、返す場合は構文2を用いる。構文1は省略可能であり、処理がメソッド末尾に到達した場合、暗黙的に呼び出し元へ制御が戻る
 
=== BASIC ===
[[BASIC]]、あるいは[[Visual Basic]]のバージョン6までに於いて、return文とは、<code>gosub</code>によって飛んだ[[サブルーチン]]から、元の[[メインルーチン]]へと戻る命令である。gosub元の行番号、もしくは構文の位置を記憶しておき、<code>return</code>と書かれた個所までプログラムの進行が辿り着くと、記憶していた次の命令もしくは行番号を読み、実行を続けてゆく。
 
BASICにおけるreturn文には、行番号を伴うものと伴わないものの2つがある。
 
==== 構文1 ====
:構文
<pre>return</pre>
:<span style="font-family:serif">return</span>
 
:例
<pre> 10 a=1:gosub 100
<syntaxhighlight lang="basic">
<pre> 10 a=1:gosub 100
20 a=2:gosub 100
30 a=3:gosub 100
68 ⟶ 82行目:
100 'サブルーチン
110 print a
120 return</pre>
</syntaxhighlight>
 
上のプログラムリストの場合、行番号100から120がサブルーチンになり、行番号10~40はそれぞれサブルーチンへと飛び、行番号120から再びメインルーチンへと帰還する流れをとる。
75 ⟶ 90行目:
 
==== 構文2 ====
:構文
<pre>return 行番号</pre>
:<span style="font-family:serif">return ''行番号''</span>
 
:例
<pre> 10 a=1:gosub 100
<syntaxhighlight lang="basic">
<pre> 10 a=1:gosub 100
20 a=2:gosub 100
30 a=3:gosub 100
88 ⟶ 106行目:
150 'サブルーチンからの離脱
160 print "end"
170 end</pre>
</syntaxhighlight>
 
上の例では <code>a</code> の値として <code>3</code> が代入された行番号30からのサブルーチンへのジャンプ以降は、行番号130の <code>return 150</code> によってルーチンから解放され、行番号150へと飛ぶ。既にreturnを経ているため、仮にこの後にreturn文があっても行番号40に戻ることは二度と無く、エラーを返すこととなる。
 
また、多くのBASICではgosub returnは[[ネスティング|ネスト]]を作ることが可能であり、サブルーチンから更に別のサブルーチンへと飛ばせる。この場合、returnも二重に扱えることとなる。