이번 글에서는 C언어에서 숫자를 100번 출력하는 방법을 알아보겠습니다. 단, 몇 가지 제약 조건이 있습니다. 반복문(loop), 재귀 함수(recursion), 매크로 확장(macro expansion)을 사용할 수 없습니다.
setjmp와 longjmp를 활용한 해결 방법
이 문제를 해결하기 위해 C언어의 setjmp()과 longjmp() 함수를 활용할 수 있습니다. 이 두 함수는 setjmp.h 헤더 파일에 정의되어 있으며, 프로그램 실행 흐름을 특정 지점으로 되돌아가게 하는 비지역 점프(non-local jump) 기능을 제공합니다.
setjmp(buf): 현재 위치를jmp_buf버퍼에 저장하여 나중에 되돌아올 지점을 표시합니다.longjmp(buf, val):setjmp로 저장된 지점으로 실행 흐름을 이동시킵니다.
이 원리를 이용하면 반복문이나 재귀 호출 없이도 코드가 특정 지점을 반복해서 지나가도록 만들 수 있습니다.
예제 코드
#include <stdio.h>
#include <setjmp.h>
jmp_buf buf;
main() {
int x = 1;
setjmp(buf); // buf를 사용해 점프 지점 설정
printf("5"); // 숫자 출력
x++;
if (x <= 100)
longjmp(buf, 1); // setjmp가 표시한 지점으로 점프
}실행 결과
5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555
코드 동작 원리
위 코드의 동작 과정은 다음과 같습니다.
- 변수
x를 1로 초기화합니다. setjmp(buf)가 현재 실행 지점을buf에 기록합니다.printf("5")가 숫자 5를 한 번 출력합니다.x값을 증가시킨 후, 아직 100 이하라면longjmp(buf, 1)을 호출하여 다시setjmp지점으로 돌아갑니다.- 이 과정이 총 100회 반복되면 조건문이 거짓이 되어 프로그램이 종료됩니다.
이처럼 setjmp과 longjmp를 조합하면 반복문, 재귀, 매크로 확장 없이도 원하는 횟수만큼 코드를 반복 실행할 수 있습니다. 참고로 이 방식은 오류 처리나 상태 복원에 주로 활용되며, 일반적인 반복 작업에는 성능과 가독성 면에서 루프를 사용하는 것이 권장됩니다.