C++에서 함수를 호출할 때 여러 개의 인자를 전달하는 경우가 많습니다. 이때 한 가지 궁금증이 생길 수 있습니다. 함수 매개변수는 어떤 순서로 평가될까? 왼쪽에서 오른쪽으로 평가될까요, 아니면 오른쪽에서 왼쪽으로 평가될까요?
평가 순서 확인 방법
매개변수의 평가 순서는 간단한 프로그램을 통해 직접 확인할 수 있습니다. 아래 예제에서는 증가 연산자(++)가 적용된 인자들을 함수에 전달하고, 출력 결과를 통해 각 매개변수가 어떤 순서로 평가되었는지 파악합니다.
예제 코드
#include<iostream>
using namespace std;
void test_function(int x, int y, int z) {
cout << "x의 값: " << x << endl;
cout << "y의 값: " << y << endl;
cout << "z의 값: " << z << endl;
}
int main() {
int a = 10;
test_function(a++, a++, a++);
}실행 결과
x의 값: 12 y의 값: 11 z의 값: 10
결과 분석
출력 결과를 보면 평가 순서를 쉽게 이해할 수 있습니다. 변수 a는 초기값이 10이며, 후위 증가 연산자(a++)는 현재 값을 먼저 반환한 뒤 1을 증가시킵니다.
- 가장 먼저 z에 해당하는 세 번째 인자가 평가되어 10을 받았습니다.
- 그다음 y에 해당하는 두 번째 인자가 평가되어 11을 받았습니다.
- 마지막으로 x에 해당하는 첫 번째 인자가 평가되어 12를 받았습니다.
즉, 이 컴파일러 환경에서는 매개변수가 오른쪽에서 왼쪽으로(right to left) 평가되었음을 알 수 있습니다. 이는 스택에 인자를 push하는 방식과 관련이 있습니다.
주의 사항
다만 중요한 점은 C++ 표준에서는 함수 인자의 평가 순서를 명시적으로 규정하지 않는다(unspecified behavior)는 것입니다. 따라서 컴파일러(GCC, Clang, MSVC 등)나 최적화 옵션에 따라 평가 순서가 달라질 수 있으며, 실제 코드에서는 인자 평가 순서에 의존하는 표현식(예: a++, a++, a++)을 작성하지 않는 것이 안전합니다. 평가 순서가 중요하다면 인자를 미리 별도의 변수에 저장한 후 전달하는 것이 좋은 코딩 습관입니다.