Namespaces
Variants

return statement

From cppreference.net

現在の関数を終了し、指定された値を呼び出し元関数に返します。

目次

構文

attr-spec-seq (オプション) return expression ; (1)
attr-spec-seq (オプション) return ; (2)
expression - 関数の戻り値の初期化に使用される式
attr-spec-seq - (C23) オプションの 属性 リスト、 return 文に適用される

説明

1) 式を評価し、現在の関数を終了して式の結果を呼び出し元に返します(返された値は関数呼び出し式の値となります)。関数の戻り値の型が void でない場合にのみ有効です。
2) 現在の関数を終了します。関数の戻り値の型が void の場合にのみ有効です。

式の型が関数の戻り値の型と異なる場合、その値は関数の戻り値の型を持つオブジェクトへの代入によって 変換 されます。ただし、オブジェクト表現の重複は許可されます:

struct s { double i; } f(void); // 構造体sを返す関数
union { struct { int f1; struct s f2; } u1;
        struct { struct s f3; int f4; } u2; } g;
struct s f(void)
{
    return g.u1.f2;
}
int main(void)
{
// g.u2.f3 = g.u1.f2; // 未定義動作(代入時のオーバーラップ)
   g.u2.f3 = f();     // 適切に定義された動作
}

戻り値の型が実浮動小数点型の場合、結果は新しい型で暗示される範囲と精度よりも 広い範囲と高い精度 で表現される可能性があります。

voidを返す関数の終端に到達することは、 void を返すことに相当します。 return ; 。その他の値を返す関数の終端に到達することは、関数の結果が式で使用される場合、未定義動作となります(このような戻り値を破棄することは許可されています)。 main 関数については、 main function を参照してください。

no-return関数 内で return 文を実行することは未定義動作です。

(C11以降)

キーワード

return

#include <stdio.h>
void fa(int i)
{
    if (i == 2)
       return;
    printf("fa():   %d\n", i);
} // implied return;
int fb(int i)
{
    if (i > 4)
       return 4;
    printf("fb():   %d\n", i);
    return 2;
}
int main(void)
{
    fa(2);
    fa(1);
    int i = fb(5);   // 戻り値4がiの初期化に使用される
    i = fb(i);       // 戻り値2が代入の右辺値として使用される
    printf("main(): %d\n", i);
}

出力:

fa():   1
fb():   4
main(): 2

参考文献

  • C17規格 (ISO/IEC 9899:2018):
  • 6.8.6.4 return文 (p: 111-112)
  • C11規格 (ISO/IEC 9899:2011):
  • 6.8.6.4 return文 (p: 154)
  • C99規格 (ISO/IEC 9899:1999):
  • 6.8.6.4 return文 (p: 139)
  • C89/C90標準 (ISO/IEC 9899:1990):
  • 3.6.6.4 return文

関連項目