Page 68 - Do it! 자료구조와 함께 배우는 알고리즘(C 언어, 3쇄)
P. 68

a  함수 형식 매크로 swap의 잘못된 정의
                    1  #define swap(type, x, y)  { type t = x; x = y; y = t; }

                   if(a > b)                                          if(조건식)
                     { type t = a; a = b; b = t; }   ;                        명령문  명령문
                                               if문 종료!
                   else                                               else
                     { type t = a; a = c; c = t; }   ;                        명령문  명령문
                                                         여기까지만 if문으로 해석합니다. 나머지
                                                         명령문은 대응하는 if문이 끊어집니다.


                   그래서 오른쪽  B  처럼 세미콜론을 없애면 매크로가 치환한 다음의 컴                  B   if(a > b)
                   파일 오류는 피할 수 있습니다. 하지만 이러한 코드는 C 언어 프로그                         swap(int, a, b)
                                                                              else
                   램답지 않습니다. 또한 실수로 세미콜론을 붙이는 것만으로 오류가 발                          swap(int, a, c)
                   생할 수도 있는 호출 방법을 사용자에게 권할 수는 없습니다.


                   올바른 정의(블록을 do문으로 둘러싸는 경우)
                   함수 형식 매크로 swap의 올바른 정의와 이를 사용한 프로그램의 일부(치환한 모습)인  A  를 나타낸 것
                   이 그림  b  입니다. 이렇게 해야 치환한 다음의 전체 코드가 올바른 if문이 됩니다. 왜냐하면 do문의 구
                   문 표기법은 ‘do문 while(식);’이기 때문입니다.              do문은 do부터 세미콜론까지가 하나의 구문입니다.


                    b  함수 형식 매크로 swap의 올바른 정의
                    2  #define swap(type, x, y)  do { type t = x; x = y; y = t; } while(0)

                     if(a > b)                                        if(조건식)
                       do { type t = a; a = b; b = t; } while(0);          명령문
                     else                                             else
                       do { type t = a; a = c; c = t; } while(0);          명령문


                                                                      전체가 if문
                              [그림 2C-3] 함수 형식 매크로 swap은 문장이 그대로 치환됩니다.





                   기수 변환

                   이번에는 정수 값을 임의의 기수(基數)로 변환하는 알고리즘을 살펴보겠습니다. 10진수 정수
                   를 n진수 정수로 변환하려면 정수를 n으로 나눈 나머지를 구하는 동시에 그 몫에 대해 나눗셈
                   을 반복해야 합니다. 이 과정을 몫이 0이 될 때까지 반복하고, 이런 과정으로 구한 나머지를

                   거꾸로 늘어 놓은 숫자가 기수로 변환한 숫자입니다. 이런 생각을 바탕으로 10진수 59를 2진
                   수, 8진수, 16진수로 변환하는 모습을 그림 2-11에 나타냈습니다.



                   68   C 알고리즘
   63   64   65   66   67   68   69   70   71   72   73