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

초록색 박스로 표시한 부분에 정의한 swap은 ‘type형 변수 x, y의 값을 교환하는’ 함수 형식

                        의 매크로입니다. ary_reverse 함수는 함수 형식 매크로 swap을 n/2회 호출하여 배열의 요
                        소를 역순으로 정렬합니다.
                           함수 형식 매크로는 프로그램을 컴파일하는 과정에서 그대로 치환됩니다. 따라서 회색 박스로 표시한 부분은 아래처럼 치
                        환하여 컴파일됩니다.

                         for(i = 0; i < n / 2; i++)
                           do { int t = a[i]; a[i] = a[n - i - 1]; a[n - i - 1] = t; } while(0);



                        do문의 반복을 계속할지의 여부를 판단하는 제어식이 0이므로 { } 안의 코드는 1회만 실행됩
                        니다. 루프의 코드가 2회 이상 반복되지 않으므로 치환되는 코드는 결국 아래 프로그램(일부)과
                        같습니다.


                         for(i = 0; i < n / 2; i++)
                           { int t = a[i]; a[i] = a[n - i - 1]; a[n - i - 1] = t; }



                        그런데도 굳이 do문을 사용한 이유는 보충수업 2-5에서 알아보겠습니다.



                            보충수업 2-5   같은 자료형인 두 값을 교환하는 함수 형식 매크로

                        같은 자료형의 두 값을 교환하는 함수 형식 매크로 swap의 정의에서 { } 블록이 do문으로 둘러싸인 이
                        유를 알아보겠습니다.



                        잘못된 정의(블록을 do문으로 둘러싸고 있지 않은 경우)
                        그림 2C-3  a  의  1  은 잘못된 정의입니다.  a  의  1  은 함수 형식 매크로 swap을 정의할 때 블록을
                        do문으로 둘러싸고 있지 않습니다.


                        이렇게 정의하면 오른쪽 프로그램  A  에서 컴파일 오류가 발생합니다.                 A  if(a > b)
                                                                                       swap(int, a, b);
                                                                                   else
                                                                                       swap(int, a, c);


                        왜 오류가 발생할까요? 그림과 함께 매크로 치환 후의 프로그램을 보면서 왜 그런지 살펴보겠습니다.
                        a > b를 만족한다고 가정하면 if의 { } 블록이 실행됩니다. 그러면 바로 뒤에 else가 와야 하는데 치환한
                        자리 다음에 불필요한 세미콜론 ;이 나옵니다. 이렇게 되면 else에 대응하는 if가 세미콜론에 의해 끊
                        어집니다.




                                                                                      02• 기본 자료구조  67
   62   63   64   65   66   67   68   69   70   71   72