C/C++ Switch Case 문에서 Break가 필요한 이유

기본 문법은 자꾸 안쓰면 잊어버린다...

문제

오늘 C/C++ 공부를 하다가 연습문제 하나를 푸는데, 표준입력으로 주어지는 정수와 문자열을 처리하는 문제였다. 다만 주어지는 정수를 서수로 표현하여 문자열로 다시 출력해주어야 했는데, 이때 if문으로 처리하지 않고 switch case문으로 처리하고자 했다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
    int number;
    char name[31], result[40];

    scanf("%d\n", &number);
    scanf("%s", name);

    switch(number)
    {
    case 1 :
        sprintf(result, "%dst %s", number, name);

    case 2 :
        sprintf(result, "%dnd %s", number, name);

    case 3 :
        sprintf(result, "%drd %s", number, name);

    default :
        sprintf(result, "%dth %s", number, name); 
    }

    printf("%s\n", result);

    return 0;
}

문제 발생 원인

코드에 따르면 표준입력으로 1부터 3까지 정수가 들어오면 각 숫자에 맞는 서수 표현자가 출력되어야 하는데 계속 1th case와 같이 표현되었다. 이유가 뭔지 한참 찾아보다가 break문을 넣어주지 않았다는 것을 깨달았다. C/C++는 case분기가 일어날 때마다 마지막에 break를 넣어주어야 각 case에서 코드가 종료되기 때문이다.

이걸 "Falling through"라고도 부른다던데, 정말 잠깐 C를 안했더니 금세 까먹었다..ㅠㅠ 앞으로는 같은 실수 하지 않도록 해야겠다.

정답 코드

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
    int number;
    char name[31], result[40];

    scanf("%d\n", &number);
    scanf("%s", name);

    switch(number)
    {
    case 1 :
        sprintf(result, "%dst %s", number, name); break;

    case 2 :
        sprintf(result, "%dnd %s", number, name); break;

    case 3 :
        sprintf(result, "%drd %s", number, name); break;

    default :
        sprintf(result, "%dth %s", number, name); break;
    }

    printf("%s\n", result);

    return 0;
}