컴파일러
위의 함수에 상수 전파·상수 폴딩·불필요한 코드 제거를 충분히 적용했을 때, 함수가 반환하는 값과 남는 코드로 올바른 것은 무엇인가?
int h(void) {
int a = 5;
int b = a * 3;
int c = b - a;
if (c > 100) return 0;
return c * 2;
}
- A항상 20을 반환하며, if문의 판정은 삭제된다
- B항상 0을 반환하며, return c * 2는 삭제된다
- C계산이 모두 남아 있으며, 실행 시에 20 또는 0을 반환한다
정답과 해설 보기
정답: A. 항상 20을 반환하며, if문의 판정은 삭제된다
a = 5를 전파하면 b = 5 * 3 = 15, c = 15 − 5 = 10으로 폴딩할 수 있습니다. 그러면 조건 c > 100은 10 > 100이므로 항상 거짓임을 알 수 있어, return 0의 분기는 결코 실행되지 않는 불필요한 코드로 삭제됩니다. 남는 return c * 2는 10 × 2 = 20이 되어 함수는 return 20;만 남습니다. 조건이 항상 거짓이므로 0을 반환하는 일은 없고, 실행 시에 계산이나 판정을 할 필요도 없습니다.
- A. 올바릅니다. c = 10이어서 조건이 항상 거짓이 되고 20만 반환하는 코드가 됩니다.
- B. 조건이 항상 거짓이므로 0을 반환하는 일은 없습니다.
- C. 모두 상수로 정해지므로 실행 시 계산은 남지 않습니다.