무엇을 하는 것인가
if (조건) { ... }. 조건이 참이면 중괄호 안이 실행됩니다. 파이썬의 콜론과 들여쓰기 자리를 괄호와 중괄호가 대신합니다.
C에는 원래 참/거짓 형이 없었습니다. 0이면 거짓, 0이 아니면 전부 참입니다. 그래서 if (개수)는 "개수가 0이 아니면"이라는 뜻으로 쓸 수 있습니다.
가장 위험한 실수는 ==를 =로 쓰는 것입니다. if (x = 5)는 x에 5를 넣고, 그 결과 5는 0이 아니므로 항상 참이 됩니다. 컴파일도 됩니다. -Wall을 켜면 경고를 주니 반드시 켜세요.
두 번째 함정은 중괄호 생략입니다. if (조건) 다음에 중괄호 없이 두 줄을 쓰면 첫 줄만 조건에 딸려갑니다. 들여쓰기를 아무리 맞춰도 C는 신경 쓰지 않습니다. 한 줄짜리라도 중괄호를 치는 습관이 이 사고를 통째로 없앱니다.
세 번째는 if (조건); 처럼 조건 뒤에 세미콜론을 찍는 것입니다. "조건이 참이면 아무것도 안 한다"가 되고 아래 블록은 조건과 무관하게 늘 실행됩니다.
예제 코드
아래 코드가 위 버튼으로 받는 파일과 같은 내용입니다. 통째로 복사해 실행해 보고, 값을 바꿔 가며 결과가 어떻게 달라지는지 보는 편이 읽기만 하는 것보다 훨씬 빨리 익습니다.
/* if 조건문 — 컴파일은 되는데 결과가 틀리는 자리들
컴파일: gcc c-if.c -o cif -Wall */
#include <stdio.h>
int main(void)
{
int 점수 = 0;
printf("점수를 입력하세요: ");
if (scanf("%d", &점수) != 1) {
printf("숫자를 넣어야 합니다.\n");
return 1; /* 0 이 아닌 값 = 문제가 있었다 */
}
char 학점;
if (점수 >= 90) {
학점 = 'A';
} else if (점수 >= 80) { /* 위가 거짓일 때만 봅니다 */
학점 = 'B';
} else if (점수 >= 70) {
학점 = 'C';
} else {
학점 = 'F';
}
printf("학점: %c\n", 학점);
/* 0 은 거짓, 나머지는 전부 참 */
int 개수 = 0;
if (개수) {
printf("뭔가 있습니다\n");
} else {
printf("개수가 0 입니다\n"); /* 이쪽 */
}
/* && 그리고, || 또는, ! 아니다 */
int 나이 = 21;
int 재학중 = 1;
if (나이 >= 20 && 재학중) {
printf("성인 재학생입니다.\n");
}
/* ── 함정 1: 중괄호를 생략하면 첫 줄만 딸려갑니다 ── */
if (점수 >= 60)
printf("합격입니다.\n");
printf("<- 이 줄은 점수와 상관없이 항상 나옵니다\n");
/* ── 함정 2: 조건 뒤 세미콜론 — 조건문이 그 자리에서 끝납니다 ──
if (점수 >= 60);
{
printf("이 블록은 조건과 무관하게 늘 실행됩니다\n");
}
*/
/* ── 함정 3: = 와 == ── ( -Wall 을 켜면 경고가 나옵니다 )
if (학점 = 'A') { // 학점에 'A' 를 넣고 항상 참
printf("절대 이렇게 쓰지 마세요\n");
}
*/
/* switch — break 를 빼먹으면 아래로 줄줄이 흘러내립니다 */
switch (학점) {
case 'A':
case 'B':
printf("잘했습니다.\n");
break;
case 'C':
printf("보통입니다.\n");
break;
default:
printf("재수강 대상입니다.\n");
break;
}
return 0;
}
기억할 것
if (조건) { ... } else if (조건) { ... } else { ... }=는 넣기,==는 비교.-Wall을 켜면 컴파일러가 잡아줍니다.- 한 줄이어도 중괄호를 치세요. 생략하면 첫 줄만 딸려갑니다.
if (조건);— 세미콜론을 찍으면 조건문이 그 자리에서 끝납니다.0은 거짓, 나머지는 전부 참.&&(그리고)||(또는)!(아니다).
자주 묻는 것
조건이 분명 거짓인데 안쪽이 실행됩니다
==를 =로 썼는지 보세요. if (등급 = 1)은 등급에 1을 넣고 참이 되어 항상 실행됩니다. 헷갈리기 쉬우면 if (1 == 등급)처럼 상수를 왼쪽에 두는 방법도 있습니다. 실수로 =를 쓰면 컴파일 오류가 나기 때문입니다.
else 가 엉뚱한 if 에 붙습니다
중괄호를 생략하면 else는 가장 가까운 if에 붙습니다. 중첩된 조건문에서 중괄호를 빼면 의도와 다르게 묶입니다. 중괄호를 항상 치면 생기지 않는 문제입니다.
switch 는 언제 쓰나요
하나의 값을 여러 경우로 나눌 때 읽기 좋습니다. 다만 break를 빼먹으면 아래 case 로 줄줄이 흘러내립니다(fall-through). 범위 비교(점수 >= 90)는 switch 로 못 하니 그때는 if입니다.
실수를 == 로 비교해도 되나요
권하지 않습니다. 0.1 + 0.2 == 0.3이 거짓이 됩니다. 실수는 오차가 있어서, fabs(a - b) < 1e-9처럼 차이가 충분히 작은지로 비교합니다.