우선 이 글의 내용은
http://codeup.kr/JudgeOnline/discuss/thread.php?tid=3609&cid=
http://codeup.kr/JudgeOnline/discuss/thread.php?tid=4787&cid=
이 두 글에서의 제 답변을 정리하여 올린 것임을 밝힙니다.
1. main 함수는 왜 return 0이 없어도 정상 작동할까? + main 함수에 왜 의례적으로 return 0; 을 포함시켜 주는 것일까?
C언어 문법 책을 읽다 보면 거의 모든(아마 전부일 수도 있을 겁니다) 책에 들어있는 소스에 return 0; 이 들어있는걸 보실 수 있을 겁니다.
그래서 그런지 왜 return 0; 을 포함해야 하는지, 포함하지 않아도 문제가 없는지 그 이유를 모르시는 분들이 있을 텐데요
보통 함수는 void 반환값을 가진 함수를 제외하고는 다 자신을 호출한 곳에 반환값을 전달합니다.
그런데 main 함수는 어떨까요? main 함수는 소스의 시작이므로 운영체제가 호출을 합니다.
대다수의 운영체제에서는 프로그램이 정상적으로 종료될 경우 0을 반환하기 때문에 소스를 작성할 때
return 0; 을 마지막에 포함시키는 것 입니다.
근데, return 문 없이도 소스는 잘 컴파일되고 실행이 되죠?
그 이유는 C99 표준에 따르면 main 함수는 return 문이 없어도 0을 반환하도록 되어있기 때문입니다.
명시를 하고, 하지 않고의 차이인 거죠.
2. main 함수가 아닌 다른 함수는 return문을 사용하지 않으면 어떠한 값을 반환할까?
위에 적어놓은 것처럼, C99에서는 main함수는 return문 작성 없이도 0을 반환합니다.
다만 함수의 경우는 좀 다른데요, 이를 정확히 이해하기 위해서는 레지스터에 대한 이해가 약간 필요합니다.
레지스터의 정의는,
'컴퓨터의 중앙처리장치(CPU) 내에 있으며 연산처리, 연산결과, 복귀주소등 작은 데이터를 저장하는 아주 빠른 기억 장소' 입니다.
그런 레지스터(정확히는 범용 레지스터라고 불립니다) 중 하나인
EAX 레지스터는 '산술(덧,곱,나눗셈 등), 논리연산을 수행하여 함수의 반환값이 저장' 되는 레지스터입니다.
위 설명과 같이 함수에서 산술/논리 연산을 수행하여 변수에 대입을 하게 될 경우 EAX 레지스터의 값에 저장이 되고
함수에서 return 문이 없을 경우에는 EAX 레지스터의 값이 반환됩니다.
예시로 아래 소스를 컴파일해 보면 100이 출력되는 것을 확인할 수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 | #include <stdio.h>
int n=0;
int testFunc()
{
n+=100;
}
int main()
{
printf ( "%d\n" , testFunc());
}
|
# 잘못된 점이 있으면 댓글로 알려주시기 바랍니다.
# 향후 글의 내용을 추가 · 보강할 예정입니다.