프로그래밍을 하다 보면 하나의 함수에 여러 개의 인자를 전달하는 경우가 많습니다. 이때 자연스럽게 떠오르는 의문이 하나 있습니다. 과연 함수 매개변수는 어떤 순서로 평가될까요? 왼쪽에서 오른쪽으로 평가될까요, 아니면 오른쪽에서 왼쪽으로 평가될까요?
평가 순서를 확인하는 가장 확실한 방법은 간단한 테스트 프로그램을 직접 작성해 보는 것입니다. 아래 예제에서는 증가 연산이 포함된 여러 인자를 전달하고, 출력 결과를 통해 실제 평가 순서를 확인할 수 있습니다.
예제 코드
#include<stdio.h>
void test_function(int x, int y, int z) {
printf("The value of x: %d\n", x);
printf("The value of y: %d\n", y);
printf("The value of z: %d\n", z);
}
main() {
int a = 10;
test_function(a++, a++, a++);
}
실행 결과
The value of x: 12
The value of y: 11
The value of z: 10
결과 분석
출력 결과를 통해 평가 순서를 쉽게 파악할 수 있습니다. 변수 a의 초기값은 10입니다.
먼저 가장 오른쪽에 있는 세 번째 인자(z)가 평가되어 값 10을 전달받고, 그다음 두 번째 인자(y)가 평가되어 11을, 마지막으로 첫 번째 인자(x)가 평가되어 12를 전달받았습니다. 즉, 이 환경에서는 인자가 오른쪽에서 왼쪽으로 평가되었음을 알 수 있습니다.
주의: 컴파일러에 따라 결과가 달라질 수 있습니다
C 표준(ISO/IEC 9899)은 함수 인자의 평가 순서를 명시적으로 규정하지 않습니다. 이를 '미지정 동작(unspecified behavior)'이라고 합니다. 위 예제에서 오른쪽에서 왼쪽으로 평가된 것은 GCC를 비롯한 일부 컴파일러의 구현 방식일 뿐입니다.
따라서 a++처럼 부작용(side effect)이 있는 표현식을 함수 인자로 사용하는 코드는 컴파일러나 최적화 옵션에 따라 결과가 달라질 수 있으므로, 이식성 있는 코드를 작성하려면 반드시 피해야 합니다. 안전한 방법은 값을 미리 별도의 변수에 저장한 후 함수에 전달하는 것입니다.