Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

KNK Chap.5 (5.3) 본문

C

KNK Chap.5 (5.3)

Daryl 2022. 12. 15. 21:51

5.3 switch문

계단식 if문 대신 switch문을 사용할 수 있음.

예를 들어 숫자 학점에 따른 코멘트 출력 프로그램을 짜본다 치자.

switch (grade) {
case 4:
    printf("훌륭해요!")
    break;
case 3:
    printf("좋아요!")
    break;
case 2:
    printf("평균이에요!")
    break;
case 1:
    printf("좋지 않아요!")
    break;
case 0:
    printf("좀 더 노력하세요!")
    break;
default:
    printf("잘못된 학점입니다.")
    break;
}

만약 값이 4라 치면 "훌륭해요!"가 출력되고, break문에 의해 switch문 이후로 프로그램이 넘어감.

만약 grade의 값이 지정된 조건에 해당하지 않으면 default 조건으로 넘어감.

 

switch문은 조건이 많을 수록 실행속도가 빠름.

대부분의 경우 switch문은 아래와 같은 구조를 가짐.

switch (expression) {
case constant-expression:
    statements
...
case constant-expression:
    statements
default:
    statements
}

○ 제어식controlling expression:

switch라는 단어 다음엔 반드시 괄호로 둘러싸인 정수 표현식이 나와야 함.

C에서는 문자를 정수로 취급하므로 사용할 수 있지만 고정소수는 안됨.

 

○조건 부호case label:

각 조건은 아래의 형식으로 부호가 붙여짐.

case constant-expression: 상수식은 일반 표현식과 같지만 변수나 함수 호출을 포함 못함.

5 + 10은 상수식이지만 n + 10은 상수식이 아님. 조건부호에서 상수식은 반드시 정수임.

 

○구문statements:

각 조건 부호 다음엔 한 개 이상의 구문이 올 수 있음. 복합문처럼 중괄호 써줄 필요 없음.

각 조건 부호의 구문은 주로 break문으로 끝남.

 

조건 부호 중복은 허용하지 않음. 순서는 중요치 않음.

default도 맨 마지막이 의무가 아님.

 

case 다음엔 반드시 한개의 상수식만 올 수 있음.

하지만 여러 조건 부호들이 아래와 같이 동일한 구문을 공유할 수 있음.

이때 /* intentional fallthrough */라는 주석으로 의도를 드러내는게 좋음.

switch (grade) {
case 4:
	/* intentional fallthrough */
case 3:
	/* intentional fallthrough */
case 2:
	/* intentional fallthrough */
case 1:
	printf("좋지 않아요!");
    break;
case 0:
	printf("좀 더 노력하세요!");
    break;
default:
	printf("잘못된 학점입니다.");
    break;
}

switch문은 default 조건이 필수가 아님.

그렇지만 실무 코딩에서는 필수로 쓰임.

주어진 조건 부호 이외의 상황이 발생할 경우에는 일부러 오류를 내어 종료시켜야 하기 때문.

그래서 의도적으로 assert(false)를 사용해 프로그램을 종료해주는 경우도 많음.

 

break 구문의 역할

말 그대로 switch 문에서 나오게 만드는 역할임.

그렇다면 왜 필요한가? switch문이 계산된 도약computed jump이기 때문임.

제어식이 평가될 때 제어는 switch문의 표현식 값에 해당하는 조건부호로 도약jump하게 됨.

조건 부호는 switch 문 내에서의 이동지점을 뜻함.

조건의 마지막 구문이 실행되면 제어는 그 다음 조건의 첫번째 구문으로 넘어감falls through.

break문이나 기타 도약문이 없다면 제어는 계속해서 다음 조건으로 넘어감.

예를 들면, 위의 학점 출력 메시지가 하나로 끝나지 않고 마지막까지 쭉 나올 수 있다는 것임.

 

[!!!] break문을 실수로 빼먹는건 흔한 실수임. 주의할 것.

의도적으로 조건이 그대로 넘어가게 하고 싶다면 그런 의도는 주석으로 꼭 써주는게 좋음.

 

[프로그래밍] 날짜를 법률상의 서식으로 출력하기

계약서 등의 법적 서류들은 미국에서 아래의 방식으로 날짜를 표기함.

Dated this __________day of ________, 20__.

사용자가 날짜를 월/일/년 형식으로 입력하면 위의 형식대로 변환하는 프로그램을 만들 것임.

 

여기서 문제가 생김. 

1. 날짜의 "번째" 부분을 어떻게 추가할 건지?

2. 월 을 숫자 대신 문자로 어떻게 입력할 건지?

→ switch 문으로 해결 가능!

 

년도 두 자리를 출력할 때 %.2d를 사용함. 

%d만을 사용할 경우 한자리수 년도가 의도한대로 출력되지 않음.

(Ex. 2005 → 205)

'C' 카테고리의 다른 글

KNK Chap.6 (6.1)  (0) 2022.12.16
KNK Chap.5 (Q&A)  (0) 2022.12.16
KNK Chap.5 (5.2)  (0) 2022.12.15
KNK Chap.5 (5.1)  (0) 2022.12.15
KNK Chap.4 (Q&A)  (0) 2022.12.14
Comments