컴파일러
C 언어에서 부호 있는 정수의 오버플로는 미정의 동작이다. 이 전제에서 위의 함수를 최적화하는 컴파일러가 생성할 수 있는 코드로 올바른 것은?
int f(int x) {
return x + 1 > x;
}
- Ax가 최댓값일 때만 0을 반환하도록 비교 명령을 반드시 남긴다
- B항상 1을 반환하는 코드로 치환한다
- C미정의 동작을 포함하므로 컴파일을 중단하고 오류로 처리한다
정답과 해설 보기
정답: B. 항상 1을 반환하는 코드로 치환한다
부호 있는 정수의 오버플로는 미정의 동작이므로, 컴파일러는 「올바른 프로그램에서는 오버플로가 일어나지 않는다」고 가정해도 됩니다. 그 가정 아래에서는 x + 1이 항상 x보다 크므로 비교를 생략하고 항상 1을 반환하는 코드로 만들 수 있습니다. x가 최댓값일 때 0을 기대하는 코드는 이 최적화로 기대대로 동작하지 않을 수 있습니다. 미정의 동작은 대부분 컴파일 시에 검출되지 않으며 오류가 되지도 않습니다.
- A. 오버플로하지 않는다는 전제이므로 비교를 남길 필요가 없습니다.
- B. 올바릅니다. 오버플로하지 않는다는 전제에서 항상 참으로 판단할 수 있습니다.
- C. 미정의 동작은 대부분 컴파일 시의 오류가 되지 않습니다.