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

C언어에서 세미콜론 없이 1부터 N까지 출력하는 프로그램

이번 글에서는 흥미로운 트릭 문제를 다뤄보겠습니다. 바로 세미콜론(;)을 단 한 번도 사용하지 않고 1부터 N까지의 숫자를 출력하는 방법입니다.

이 문제는 크게 두 가지 방식으로 해결할 수 있습니다. 첫 번째는 반복문(iteration)을 이용하는 방법이고, 두 번째는 재귀 호출(recursion)을 이용하는 방법입니다.

방법 1: 반복문 활용

C언어에서 printf() 함수는 출력한 문자열의 길이를 반환합니다. 숫자를 하나 출력하면 반환값은 0이 아니므로 참(true)으로 평가됩니다. 이 성질을 이용해 조건과 논리 AND(&&) 연산으로 결합하면, 별도의 세미콜론 없이 while 문의 조건식 안에서 출력과 카운터 증가를 모두 처리할 수 있습니다.

예제 코드

#include<stdio.h>
#define N 20
int main(int num, char *argv[]) {
   while (num <=N && printf("%d ", num) && num++) {
      // while 문의 몸체는 비워둡니다.
   }
}

실행 결과

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

코드가 어떻게 동작하는지 살펴보겠습니다. main 함수의 첫 번째 매개변수 num은 프로그램 실행 시 전달되는 인자 개수(argument count)이며, 일반적인 환경에서는 1로 시작합니다. 따라서 num은 1부터 시작해 조건식 안에서 계속 증가하게 됩니다.

  • num <= N: 카운터가 N 이하인지 검사합니다.
  • printf("%d ", num): 숫자를 출력하고 문자열 길이(0이 아닌 값)를 반환합니다.
  • num++: 후위 증가 연산자로 현재 값을 반환한 뒤 카운터를 1 증가시킵니다.

세 조건이 모두 참일 때만 루프가 유지되며, 몸체가 비어 있어도 조건식에서 모든 작업이 수행됩니다.

방법 2: 재귀 호출 활용

두 번째 방법은 재귀(recursion)를 이용하는 것입니다. main 함수에 매개변수를 전달하고, 그 함수가 스스로를 재귀적으로 호출하도록 만드는 방식입니다.

예제 코드

#include<stdio.h>
#define N 20
main(int val) {
   if (val <=N && printf("%d ", val) && main(val + 1)) {
      // 몸체는 비워둡니다.
   }
}

실행 결과

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

여기서도 원리는 동일합니다. val이 N 이하인 동안 숫자를 출력하고, main(val + 1) 호출을 통해 다음 숫자를 처리합니다. printf의 반환값이 0이 아니고, 재귀 호출의 결과 역시 최종적으로 0이 아니기 때문에 조건식 전체가 참으로 평가되어 재귀가 계속 진행됩니다.

마무리

두 방법 모두 C언어의 논리 연산자 단락 평가(short-circuit evaluation)와 printf 함수의 반환값이라는 특성을 교묘히 활용한 예제입니다. 실무에서는 가독성을 위해 권장되지 않지만, 언어의 내부 동작을 이해하는 데 매우 좋은 학습 자료가 됩니다.