return 문

return 문 (return statement)

함수가 일을 마치고 값을 돌려주려면 return 문을 써요. 함수를 끝내면서 호출한 쪽으로 값을 전달하는 것이 return의 핵심 동작이에요. 이 페이지에서 return 문의 문법과 동작을 살펴볼게요.

출처: cppreference

본문

현재 함수를 종료하고 지정된 값을 호출한 함수(caller)에 돌려줘요.

구문 (Syntax)

attr-spec-seq (optional) return expression ;   (1)
attr-spec-seq (optional) return ;              (2)
  • expression — 함수의 반환 값을 초기화하는 데 쓰는 표현식
  • attr-spec-seq — (C23) return 문에 적용되는 속성(attributes)의 선택적 목록

설명 (Explanation)

  1. 표현식을 평가하고, 현재 함수를 종료한 뒤 그 결과를 호출한 쪽에 돌려줘요 (돌려받은 값은 함수 호출 표현식의 값이 돼요). 함수의 반환 타입이 void가 아닐 때만 유효해요.

  2. 현재 함수를 종료해요. 함수의 반환 타입이 void일 때만 유효해요.

표현식의 타입이 함수의 반환 타입과 다르다면, 그 값은 반환 타입인 객체에 할당하듯 변환돼요. 다만 객체 표현 간의 겹침(overlap)은 허용된다는 점이 달라요:

struct s { double i; } f(void); // function returning struct 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; // undefined behavior (overlap in assignment)
   g.u2.f3 = f();     // well-defined
}

반환 타입이 실수 부동소수점 타입이라면, 결과는 새 타입이 암시하는 것보다 더 넓은 범위와 정밀도로 표현될 수 있어요.

void를 반환하는 함수의 끝에 도달하는 것은 return;과 동등해요. 그 외에 값을 반환하는 함수의 끝에 도달하는 것은, 그 함수의 결과를 표현식에서 사용할 때 정의되지 않은 동작이에요 (그 반환 값을 버리는 것은 허용돼요). main에 대해서는 main 함수 문서를 봐요.

_Noreturn(아무 것도 반환하지 않는) 함수에서 return 문을 실행하는 것은 정의되지 않은 동작이에요. (since C11)

키워드 (Keywords)

return

예제 (Example)

#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);   // the return value 4 used to initializes i
    i = fb(i);       // the return value 2 used as rhs of assignment
    printf("main(): %d\\n", i);
}

출력:

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

더 알아보기