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