관우는 왜 C 언어를 살육했나? [2-8] switch()문
by
[2-8] switch()문
switch문은 수식의 결괏값과 일치하는 곳으로 분기하는 다중 결정 구문입니다. 형식은 다음과 같습니다.
switch (수식) {
case 상수 : 문장
.
.
.
case 상수 : 문장
default : 문장
}
일반적으로 문장의 끝에 break; 키워드를 사용합니다. break;는 해당 블록을 빠져나가는 지시어입니다.
0~9값을 입력하면 “is number”를 출력하는 예제를 살펴보겠습니다.
#include <stdio.h>
int main(void) {
char c;
c = getchar();
switch(c){
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
printf("%c is number\n",c);
break;
default:
printf("%c is not number\n",c);
}
return 0;
}
a를 입력했을 때 결과는 다음과 같습니다.
[출력]
a is not number
3를 입력했을 때 결과는 다음과 같습니다.
[출력]
3 is number
아래 두 예제는 모두 같은 기능을 합니다.
[예제 1]
#include <stdio.h>
int main(void) {
char c;
c = getchar();
switch(c){
case '1':
printf("hello 1");
break;
case '2':
printf("hello 2");
break;
case '3':
printf("hello 3");
break;
default:
printf("bye");
break;
}
return 0;
}
[예제 2]
#include <stdio.h>
int main(void) {
char c;
c = getchar();
switch(c){
case '1':
case '2':
case '3':
printf("hello %c", c);
break;
default:
printf("bye");
}
return 0;
}
그런데 switch()에 들어갈 수식은 정수이어야 합니다. 0.123이나 ‘hello world’는 수식으로 들어갈 수 없습니다. 꼭 수식으로 정수 하나만 들어갈 필요는 없습니다. 수식의 결과가 정수이면 상관이 없습니다. 따라서 long, int, unsigned int, char 형은 사용할 수 있습니다. 하지만 float과 doble 형은 수를 표현하는 자료형이지만 사용할 수 없습니다. 정수형 자료가 아니기 때문입니다.
앞에서 다룬 예제를 long형으로 변환해보겠습니다.
#include <stdio.h>
int main(void) {
long i;
scanf("%l", &i);
switch(i){
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
printf("%i is number\n", i);
break;
default:
printf("%i is not number\n", i);
}
return 0;
}
예상대로 잘 동작합니다.
switch(i)
대신
switch(i + i)
흑은
switch(i + 3)
같은 수식으로 변환해도 잘 동작합니다.
switch() 수식으로 올 수 있는 경우는 다음과 같습니다.
컴퓨터가 정수로 인식하는 모든 것
예를 들어 다음과 같은 경우가 있습니다.
- 정수 자체
- 정수형 자료 (in, long, short, char)
- 연산 결과가 정수값인 수식
이상 관우였습니다.
殺
제갈량은 동남풍 : char형은 정말로 정수형 자료형일까?
char형 문자형 자료일 것 같은데요? 이상합니다. 왜 정수형 자료형이라고 할까요? 궁금하시죠? 제갈량이 그 궁금증을 풀어드리겠습니다!
char형이냐 int형이냐는 사람의 관점입니다. 컴퓨터 입장에서는 char형도 8비트짜리 수일 뿐입니다. 아스키 코드 기억나시죠? 7비트로 문자를 표현하는 방식이요. 아직도 컴퓨터는 이 아스키표를 사용해 문자 하나를 char형으로 표현합니다.
처음 다룬 예제에서는 switch( )에 사용된 수식이 char형이었습니다. 이 예제를 약간 변경해서 정수형 자료로 정말로 컴퓨터가 인식하고 처리하는지 확인해볼게요!
다음 예제는 처음 예제에서 case부분은 0’~’9’ 대신 아스키표로 숫자 0을 뜻하는 48부터 9를 뜻하는 57까지로 대체했습니다.
int main(void) {
char c;
int i;
scanf("%d", &i);
c = (char)i;
printf("i = %d, c = %c\n", i, c);
switch(c){
case 48 : // 숫자 0의 아스키 코드값
case 49 :
case 50 :
case 51 :
case 52 :
case 53 :
case 54 :
case 55 :
case 56 :
case 57 :
printf("%c is number\n",c);
break;
default:
printf("%c is not number\n",c);
}
return 0;
}
숫자를 입력하고 char형인 c로 강제 대입시켜 결과를 출력하는 예제입니다.
숫자 0을 뜻하는 48을 입력한 결과는 다음과 같습니다.
i = 48, c = 0
0 is number
숫자 9를 뜻하는 57을 입력한 결과는 다음과 같습니다.
i = 57, c = 9
9 is number
숫자 65를 입력한 결과입니다.
i = 65, c = A
A is not number
switch()문의 수식으로 char형 변수 c가 입력되었음에도 case문에서 오류 없이 제대로 비교가 되었습니다!
즉 입력된 수식 c를 정수로 인식했기 때문입니다.
이로써 컴퓨터가 char형을 정수형 자료로 인식하고 있다는 것을 확인할 수 있습니다.
風 |
Subscribe via RSS