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 알고리즘
   115   116   117   118   119   120   121   122   123   124   125