C 언어 기초

int fact(int n) {
    if (n <= 1)
        return 1;
    return n * fact(n - 1);
}

int는 32비트(최댓값 2147483647)로 한다. 위의 함수 fact(n)이 n의 계승을 오버플로 없이 올바르게 반환하는 최대의 n은?

  1. A12
  2. B13
  3. C20
정답과 해설 보기

정답: A. 12

fact는 n × fact(n − 1)처럼 자기 자신을 호출하고, n이 1 이하가 되면 1을 반환하는 재귀 함수입니다. 12! = 479001600은 int의 최댓값 2147483647보다 작으므로 올바르게 구해지지만, 13! = 6227020800은 최댓값을 넘습니다. fact(13)에서는 마지막 13 × 479001600의 곱셈에서 부호 있는 정수의 오버플로가 일어나며, 이는 미정의 동작입니다. 예를 들어 최적화를 하지 않는 x86-64의 gcc에서는 6227020800을 2³²로 나눈 나머지인 1932053504가 반환되지만, 이 결과는 보장되지 않습니다. 더 큰 n에는 64비트 long long(n = 20까지) 등을 사용합니다.

이 분야 연습하기 분야로 돌아가기

C 언어 기초의 다른 문제

  1. int는 4바이트, 포인터는 8바이트로 한다. int형에 대한 포인터 p의 값(주소)이 0x1000일 때, p + 3의 값은?
  2. int는 4바이트, 포인터는 8바이트로 한다. 위의 프로그램을 실행했을 때의 출력으로 올바른 것은?
  3. int는 4바이트로 한다. 위의 코드를 실행했을 때의 출력으로 올바른 것은?
  4. 문자열을 넣은 char 배열에 대해, 위의 코드를 실행했을 때의 출력으로 올바른 것은?
  5. 위의 선언 다음에 ㄱ "p = t;", ㄴ "*p = 'x';", ㄷ "q = t;", ㄹ "*q = 'x';" 중 하나를 쓴다. 컴파일 오류가 되는 것의 조합은?