툴곰코드 노트C언어 › C언어 if 조건문

C언어 if 조건문

조건문 자체는 어렵지 않습니다. 다만 중괄호를 생략했을 때와 세미콜론을 잘못 찍었을 때, 컴파일은 되는데 결과가 틀립니다.

⬇ 예제 파일 받기 (.c)
C언어 · 회원가입 없음
내려받아 gcc 파일이름.c -o 실행파일 -Wall 로 컴파일한 뒤 실행합니다.
광고 영역

무엇을 하는 것인가

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 (등급 = 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처럼 차이가 충분히 작은지로 비교합니다.

이어서 볼 글