컴파일러

C 언어에서 부호 있는 정수의 오버플로는 미정의 동작이다. 이 전제에서 위의 함수를 최적화하는 컴파일러가 생성할 수 있는 코드로 올바른 것은?

int f(int x) {
    return x + 1 > x;
}
  1. Ax가 최댓값일 때만 0을 반환하도록 비교 명령을 반드시 남긴다
  2. B항상 1을 반환하는 코드로 치환한다
  3. C미정의 동작을 포함하므로 컴파일을 중단하고 오류로 처리한다
정답과 해설 보기

정답: B. 항상 1을 반환하는 코드로 치환한다

부호 있는 정수의 오버플로는 미정의 동작이므로, 컴파일러는 「올바른 프로그램에서는 오버플로가 일어나지 않는다」고 가정해도 됩니다. 그 가정 아래에서는 x + 1이 항상 x보다 크므로 비교를 생략하고 항상 1을 반환하는 코드로 만들 수 있습니다. x가 최댓값일 때 0을 기대하는 코드는 이 최적화로 기대대로 동작하지 않을 수 있습니다. 미정의 동작은 대부분 컴파일 시에 검출되지 않으며 오류가 되지도 않습니다.

  • A. 오버플로하지 않는다는 전제이므로 비교를 남길 필요가 없습니다.
  • B. 올바릅니다. 오버플로하지 않는다는 전제에서 항상 참으로 판단할 수 있습니다.
  • C. 미정의 동작은 대부분 컴파일 시의 오류가 되지 않습니다.
이 분야 연습하기 분야로 돌아가기

컴파일러의 다른 문제

  1. 프로그램의 오류 중 컴파일 시점에 발견할 수 있는 것은?
  2. 정적 타입을 가진 언어에서 컴파일러가 타입 검사를 하는 주된 이점은?
  3. 어휘 분석에서 토큰을 구별하는 규칙을 나타내는 데 자주 사용되는 것은?
  4. 많은 프로그래밍 언어의 문법을 나타내는 데 사용되며 구문 분석의 기초가 되는 문법의 종류는?
  5. 식 2 + 3 * 4의 추상 구문 트리의 형태로 올바른 것은?

이 분야의 비교