Page 120 - Do it! 자료구조와 함께 배우는 알고리즘(C 언어, 3쇄)
P. 120
/*-- 캐스팅 없이 사용할 수 있는 비교 함수 --*/
int int_cmp(const void *a, const void *b)
{
if(*(int *)a < *(int *)b)
return -1;
else if(*(int *)a > *(int *)b)
return 1;
else
return 0;
}
void *형의 포인터 a를 int *형으로 형 변환한 포인터((int *)a)에 간접 연산자 *를 적용한 식이 *(int *)a입니다. 이 식의
값은 int형 포인터 a가 가리키는 영역을 맨 앞으로 하는 int형의 값입니다.
조금만 더! 형 변환할 때는 주의해야 해요!
원래 형 변환은 영어로 cast라고 합니다. 이때 cast는 던지다, 보내다, 주조하다의 뜻입니다. 주조(鑄造)
라는 말은 녹인 쇠붙이를 거푸집에 부어 물건을 만드는 행위를 뜻합니다. C 언어에서 형 변환(cast) 연산
자는 주조하여 특정한 형을 만들 듯이 특정한 형으로 자료형을 변환하는 연산자입니다. 예를 들어, int형
변수를 나눗셈할 때 소수점 아래에 자리가 생기는 경우가 있는데, 이때 캐스팅을 하지 않으면 소수점 아래
의 값이 사라집니다. 이를 해결하려면 int형 변수를 나눗셈할 때 double형으로 변환하고 그 결과를 다시
double형 변수에 저장하면 소수점 아래의 값을 얻을 수 있습니다.
보충수업 3-2 잘못된 비교 함수
비교 함수는 첫 번째 인수가 가리키는 값이 더 작으면 음수, 더 크면 양수 값을 반환하면 됩니다. 하지
만 꼭 –1이나 1로 특정한 값을 반환할 필요는 없습니다.
인터넷을 검색하다 보면 아래처럼 정의한 비교 함수 프로그램을 자주 볼 수 있습니다.
/*--- 아주 빠른(?) 비교 함수(오버플로의 위험이 있음) ---*/
int int_cmp(const int *a, const int *b)
{
return *a - *b;
}
아주 빠르고 간단하게 구현하려는 의도겠지만 좋은 방법은 아닙니다. 왜냐하면 뺄셈 연산 결과가 int
120 C 알고리즘