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