Programming Tools/TCPL C Language

[C Language] Chap.3 Control Flow - Switch (제어문 - switch 문)

LiDARian 2021. 6. 7. 18:00
반응형

Switch 문

switch (expression){
    case const-expr : statement
    case const-expr : statement
    default : statement
}

if-else if-else와 같이 multiway 처리를 할 때 유용한 switch문. 다른 제어문과의 중요한 차이는 해당 case에 대한 statement를 실행해도 탈출하지 않는다는 것이다.

해당하는 case에 expression이 들어맞으면 해당하는 statement가 실행된다. default는 else와 같은 존재고, 있어도 되고 없어도 된다.
참고로 default와 cases는 작성되는 순서가 정해져있지 않다.

break;는 switch 문을 탈출할 수 있게 한다. 만약 break;를 넣지 않는다고 하면 그냥 아래에 있는 모든 statement를 실행한다.
왜냐하면 case가 예약어로 취급되는 것이 아니라 그저 label로만 취급되기 때문이다. break 말고도 return으로도 switch문을 탈출할 수 있다.

예를 들자면

#include <stdio.h>

int main(){
    int c = 1;

    switch (c){
        case 1 : 
            printf("1\n");
            break;
        case 2 :
            printf("2\n");
            break;
        default :
            printf("3\n");
            break;
    }
    return 0;
}

출력
1



아래처럼 break;를 사용하지 않으면 모든 case에 해당하는 statement가 실행된다.

#include <stdio.h>

int main(){
    int c = 2;

    switch (c){
        case 1 : 
            printf("1\n");

        case 2 :
            printf("2\n");

        default :
            printf("3\n");

    }
    return 0;
}

출력
1
2
3



break를 넣지 않으면 아래로 쭉 실행된다는 점을 이용해서 아래와 같이 한 번에 많은 case를 다룰 수 있다.
다만 여러 label을 하나의 연산 statement로 묶는 경우를 제외하면 자주 사용하지는 않기를 권장한다.
그리고 각 case의 마지막 마다 break;를 넣는 습관을 가지기를 권장한다.

main(){
    int c, i, nwhite, nother, ndigit[10];

    nwhite = nother = 0;
    for(i = 0; i < 10; i++)
        ndigit[i] = 0;
    while((c = getchar()) != EOF){
        switch (c){
            case '0' : case '1' : case '2' : case '3' : case '4' :
            case '5' : case '6' : case '7' : case '8' : case '9' :
                ndigit[c - '0']++;
                break;
            case ' ' : case '\n' : case '\t' :
                nwhite++;
                break;
            default :
                nother++;
                break;
        }
    }
    printf("digits = ");
    for (i = 0; i < 10; i++){
        printf(", white spaces = %d, other = %d\n", nwhite, nother);
    return 0;
    }
}
반응형