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

C언어에서 sizeof() 안에 작성된 코드는 실행되지 않습니다

C언어의 sizeof는 함수처럼 보이지만 실제로는 연산자(operator)입니다. sizeof는 인수로 전달된 대상의 메모리 크기를 계산하는 역할을 하며, 컴파일 시점에 그 크기가 결정됩니다.

여기서 중요한 특징이 하나 있습니다. 만약 sizeof의 인수로 다른 함수 호출이나 표현식이 전달되더라도, 그 코드는 런타임에 실제로 실행되지 않습니다. sizeof는 오직 해당 표현식의 반환 타입(return type)만 확인하고, 그 타입의 크기만 계산할 뿐입니다.

아래 예제를 통해 이 동작을 직접 확인해 보겠습니다. 반복문과 함수 호출을 sizeof 안에 넣고 출력 결과를 살펴봅니다.

예제 코드

#include<stdio.h>
double my_function() {
    printf("This is a test function");
    return 123456789;
}
main() {
    int x;
    x = sizeof(printf("Hello World"));
    printf("The size: %d\n", x);
    x = sizeof(my_function());
    printf("The size: %d", x);
}

실행 결과

The size: 4
The size: 8

결과 분석

출력 결과를 보면 흥미로운 점을 발견할 수 있습니다.

  • sizeof 안에 있던 printf("Hello World")는 화면에 "Hello World"를 출력하지 않았습니다. 즉, 함수가 실행조차 되지 않은 것입니다.
  • 첫 번째 sizeof는 printf의 반환 타입인 int의 크기인 4바이트를 반환했습니다.
  • 두 번째 sizeof는 my_function()의 반환 타입인 double의 크기인 8바이트를 반환했습니다. 마찬가지로 함수 본문의 printf도 실행되지 않았습니다.

정리하면, sizeof() 내부에 작성된 함수 호출이나 표현식은 런타임에 평가되지 않으며, 컴파일러는 해당 표현식의 자료형만 판단하여 그 크기만 계산합니다. 따라서 sizeof 안에 부수 효과(side effect)가 있는 코드, 예를 들어 출력문이나 상태를 변경하는 연산을 넣더라도 절대 실행되지 않으므로 주의해야 합니다.

참고로 C99 표준부터는 가변 길이 배열(VLA)이 sizeof의 피연산자로 사용될 경우에만 예외적으로 런타임에 평가됩니다. 일반적인 경우에는 모두 컴파일 시점에 처리된다는 점을 기억해 두면 좋습니다.