이번 C 프로그래밍 퍼즐은 두 개의 숫자를 하나로 합치는 문제입니다. 단, 산술 연산자, 문자열 함수, 그리고 그 외 어떠한 함수도 사용할 수 없다는 제약 조건이 있습니다.
퍼즐의 요구 사항은 다음과 같습니다.
입력 : 12 , 54
출력 : 1254
해결 아이디어: 토큰 붙여넣기 연산자(##)
이 퍼즐의 최적 해법은 C 전처리기(preprocessor)가 제공하는 토큰 붙여넣기 연산자(token-pasting operator, ##)를 활용하는 것입니다.
매크로를 정의할 때 ## 연산자를 사용하면, 매크로에 전달된 두 개의 토큰이 전처리 단계에서 하나로 결합됩니다. 즉, 별도의 산술 계산이나 문자열 변환 없이도 두 숫자가 붙어 있는 형태의 값을 얻을 수 있습니다.
C 퍼즐 해결 프로그램
#include <stdio.h>
#define merge(a, b) b##a
int main(void) {
printf("%d ", merge(432, 23));
return 0;
}
실행 결과
23432
동작 원리
위 코드에서 merge(432, 23)은 매크로 정의 b##a에 따라 전처리 과정에서 23과 432가 결합되어 23432라는 하나의 정수 리터럴이 됩니다. 결합 작업이 컴파일 시점(전처리 단계)에 이루어지기 때문에, 실행 중에 덧셈이나 곱셈 같은 산술 연산을 사용하지 않고도 두 숫자를 합친 것과 동일한 결과를 얻을 수 있습니다.
다만 이 방법은 매크로 인수로 전달되는 상수 리터럴에만 동작한다는 점에 유의해야 합니다. 런타임에 값이 결정되는 변수에는 ## 연산자를 적용할 수 없습니다.