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

C언어에서 루프·재귀·매크로 확장 없이 숫자를 100번 출력하는 방법

이번 글에서는 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

코드 동작 원리

위 코드의 동작 과정은 다음과 같습니다.

  1. 변수 x를 1로 초기화합니다.
  2. setjmp(buf)가 현재 실행 지점을 buf에 기록합니다.
  3. printf("5")가 숫자 5를 한 번 출력합니다.
  4. x 값을 증가시킨 후, 아직 100 이하라면 longjmp(buf, 1)을 호출하여 다시 setjmp 지점으로 돌아갑니다.
  5. 이 과정이 총 100회 반복되면 조건문이 거짓이 되어 프로그램이 종료됩니다.

이처럼 setjmplongjmp를 조합하면 반복문, 재귀, 매크로 확장 없이도 원하는 횟수만큼 코드를 반복 실행할 수 있습니다. 참고로 이 방식은 오류 처리나 상태 복원에 주로 활용되며, 일반적인 반복 작업에는 성능과 가독성 면에서 루프를 사용하는 것이 권장됩니다.