Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C 언어 코딩 퍼즐: 연산자 없이 두 숫자를 하나로 합치는 방법

오늘은 C 프로그래밍 언어의 흥미로운 퍼즐 문제를 살펴보겠습니다. 48과 96이라는 두 개의 숫자가 주어졌을 때, 첫 번째 숫자(48)를 두 번째 숫자(96) 뒤에 이어 붙여 최종 결과를 9648로 만들어야 하는 문제입니다.

문제의 조건은 까다롭습니다. 논리 연산, 산술 연산, 문자열 관련 연산을 모두 사용할 수 없고, 미리 정의된(pre-defined) 함수도 호출할 수 없습니다. 그렇다면 어떤 방법으로 이 문제를 해결할 수 있을까요?

해결 방법: 토큰 붙이기 연산자(##)

답은 의외로 간단합니다. 바로 C 언어의 토큰 붙이기 연산자(Token Pasting Operator, ##)를 활용하는 것입니다.

토큰 붙이기 연산자는 전처리기(preprocessor) 연산자의 일종으로, 컴파일러에게 두 개의 토큰(token)을 하나로 연결(concatenate)하라는 명령을 전달하는 역할을 합니다. 이 연산자는 일반 코드가 아닌 매크로 정의 안에서 사용한다는 점이 특징입니다.

예제 코드

#include<stdio.h>
#define MERGE(x, y) y##x
main() {
    printf("%d", MERGE(48, 96));
}

실행 결과

9648

코드 설명

위 예제에서 매크로 MERGE(x, y)y##x로 정의되어 있습니다. 따라서 MERGE(48, 96)이 호출되면 전처리기 단계에서 두 인수가 서로 위치를 바꾸어 붙으면서 9648이라는 하나의 토큰으로 결합됩니다.

핵심은 이 과정이 컴파일 이전의 전처리 단계에서 일어난다는 점입니다. 즉, 실제 프로그램 실행 시점에는 이미 9648이라는 값이 완성되어 있으므로, 산술·논리·문자열 연산이나 별도의 함수 없이도 조건을 만족하며 문제를 해결할 수 있는 것입니다.