오랜만에 C언어 보기 👀
정보처리기사 실기 프로그래밍 언어에는 C언어, 자바, 파이썬이 나온다. 고로 두루두루 알고 있어야 함!!
C언어는 대학교 1학년 때 배운 이후로 다 까먹은..

C언어의 return 0은 왜 True가 아닐까?
return 0;이 “정상 종료”라는 건 알고 있지만,
“그럼 0이 True인가?”, “if문에서 0이면 실행되나?” 같은 궁금증이 문득 들었다.
이 글은 C언어와 Shell에서 0과 1의 의미를 설명한다.
C에서의 0과 1 (False / True)
| 값 | 의미 | 조건식에서의 동작 |
| 0 | 거짓(False) | 분기 진입 안 함 |
| 0 이외의 모든 값 | 참(True로 간주) | 분기 진입 |
if (0) puts("실행 안 됨");
if (1) puts("실행 됨");
if (-5) puts("이것도 실행 됨"); // 0이 아니면 참
참고: C99 <stdbool.h>에서 true==1, false==0으로 매크로 정의된다.
찾아보니 return 0은 c언어에서 프로그램의 종료 의미만 가질 뿐..
요새는 main 함수에서는 return 0을 명시하지 않아도 자동으로 처리된다고 한다.
C99 이후 표준에서는 main의 끝까지 도달하면 return 0;과 동일하다고 규정한다.
- C89/90에선 보장되지 않았고, C99(C11, C17 포함)부터 보장.
return 0;의 의미
main() 함수에서의 return 0;은 논리적 True/False와는 전혀 관계가 없다.
int main(void) {
// ...
return 0;
}
이 0은 운영체제에게 전달되는 종료 상태 코드(`exit code`) 다.
• 0 → “정상 종료(오류 없음)”
• 1 이상 → “비정상 종료(오류 발생)”
즉, “return 0 = 성공적 종료”이지, “true”가 아니다.
Shell(Bash)에서의 0, 1
리눅스 쉘에서는 이 개념이 반대다.
| 값 | 의미 | Shell의 해석 |
| 0 | 성공(Success) | 참(True처럼) |
| 1 이상 | 실패(Fail) | 거짓(False처럼) |
예시
# 예시
if grep "main" file.c; then
echo "찾았다" # grep이 성공(0) 반환 → 실행됨
else
echo "못찾음" # grep이 실패(1) 반환 → 실행 안됨
fi
즉, 쉘에서는 0이 성공 = True,
C에서는 0이 거짓 = False이다.
비교 요약
| 구분 | 0의 의미 | 1의 의미 | 기억 팁 |
| C / Java / Python | False (거짓) | True (참) | “0은 꺼짐” |
| Shell / Bash | Success (성공) | Fail (실패) | “0은 문제없음” |
외워두기:
C언어는 0이 거짓, 쉘은 0이 성공.
왜 이렇게 다를까?
C는 논리 연산 중심 언어이고,
Shell은 프로세스의 성공/실패 상태 전달 중심 언어이기 때문이다.
C에서는 논리 계산 결과를 0/1로 표현하고,
Shell에서는 프로그램이 잘 끝났는지를 성공이면 0, 실패면 0이 아닌 다른 숫자로 표현한다.
“return 0이 종료 코드로 해석되는 주체가 어디냐”가 C와 Shell의 핵심 차이다.
C에서 return 0은 “운영체제에게 보내는 종료 코드”
C 프로그램이 끝날 때 main() 함수가 반환한 값은 운영체제(OS) 에게 전달된다.
이 값은 단순한 함수의 return 값이 아니라 “프로세스의 종료 코드(exit code)”이다.
int main(void) {
// 프로그램 로직 ...
return 0; // 운영체제에게 "정상 종료" 신호 보냄
}
- main() 함수가 끝나면, 내부적으로 exit(0)과 동일하게 처리된다.
- 이때 운영체제는 이 값을 받아서, “이 프로그램이 성공적으로 끝났는가?”를 를 판단한다.
- 따라서 return 0;은 “논리적 true”가 아니라 “정상 종료(exit code 0)”을 의미한다.
예시
$ gcc test.c -o test
$ ./test
$ echo $?
0
→ `echo $?`는 직전 프로그램의 종료 코드를 출력한다.
C 프로그램이 return 0;으로 끝났기 때문에 쉘이 0을 받는 것이다.
쉘에서 종료 코드는 “프로그램 실행 결과를 판단하는 기준”
리눅스 쉘은 실행한 명령어의 종료 코드를 읽어와 조건문을 판단한다.
이때 기준은 다음과 같다.
| 종료 | 코드의미 | Shell에서의 판단 |
| 0 | 정상 종료 (성공) | 참(True) |
| 1 이상 | 오류, 비정상 종료 | 거짓(False) |
if ./test; then
echo "정상 종료"
else
echo "오류 발생"
fi
- ./test가 return 0;으로 끝나면 → 참 → “정상 종료”` 출력
- return 1;로 끝나면 → 거짓 → "오류 발생" 출력
핵심 차이
| 구분 | return의 주체 | 0의 의미 | 이 값이 전달되는 곳 |
| C | 프로그램(프로세스) | 정상 종료(exit code) | 운영체제(OS) |
| Shell | 실행된 외부 프로그램 | 성공(success) | 쉘 내부 조건 판단 |
즉,
- C의 return 0은 OS에게 “성공적으로 끝났다”는 신호를 주는 행위,
- Shell은 이 신호(종료 코드 0)를 보고 “성공(true)”로 판단하는 구조이다.
결국 C와 Shell은 서로 반대되는 게 아니라,
C → exit code 생성자,
Shell → exit code 해석자 관계
마무리
- C언어:
- 0 → false
- 0이 아닌 값 → true
- return 0; → 정상 종료(exit code 0)
- Shell:
- 0 → 성공(true처럼)
- 1 이상 → 실패(false처럼)
결국 “0의 의미는 같지만 맥락이 다르다”는 게 핵심이다.
C에서는 “논리값”, Shell에서는 “종료 코드”라는 점만 기억하면 더 이상 헷갈리지 않는다.
'Development' 카테고리의 다른 글
| [React] 배포 후 간헐적으로 개발 서버에서 화면 에러가 뜨는 이유 (0) | 2025.10.14 |
|---|---|
| [Web] 브라우저 “탭( Tab )”을 노리는 공격, Tabnabbing (0) | 2025.10.13 |
| [macOS] port 빠르게 종료하기 (0) | 2025.09.30 |
| [Cursor] Figma MCP 연결하기 (더이상의 반복 작업은 지양한다) (2) | 2025.09.30 |
| [ChatGPT] 이미 구독 중이라면, 3개월 동안 Plus 50% 할인 받기 (0) | 2025.09.29 |