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

C++ 피연산자 평가 순서 완벽 이해하기


프로그래밍 언어에는 연산이 어떤 순서와 방식으로 수행되는지를 규정하는 여러 가지 규칙이 존재합니다. 그중 핵심적인 개념이 바로 피연산자의 평가 순서(order of evaluation)연산자의 결합 방향(associativity)입니다.

대부분의 이항 연산자는 왼쪽에서 오른쪽(left to right)으로 결합됩니다. 다만 주의할 점은, C++ 표준에서 산술 연산자의 피연산자 평가 순서는 명시적으로 정해져 있지 않아 컴파일러에 따라 결과가 달라질 수 있다는 것입니다. 따라서 아래 예제의 출력 값은 사용 환경에 따라 다르게 나타날 수 있습니다.

피연산자 평가 순서 확인 예제

다음 프로그램은 같은 표현식 안에서 함수가 두 번 호출될 때 피연산자가 어떤 순서로 평가되는지 보여줍니다.

#include <iostream>
using namespace std;
int x = 2;

int changeVal() {
    x *= x;
    return x;
}

int main() {
    
    int p = changeVal() + changeVal();
    cout<<"Value: "<<x<<endl;
    cout<<"Operation result: "<<p<<endl;
    return 0;
}

실행 결과

Value: 16
Operation result: 20

결과 분석

전역 변수 x는 2로 초기화되어 있으며, changeVal() 함수는 호출될 때마다 x를 자기 자신으로 곱한 값(제곱)으로 갱신한 후 반환합니다.

  • 첫 번째 호출: x = 2 × 2 = 4, 반환값 4
  • 두 번째 호출: x = 4 × 4 = 16, 반환값 16

따라서 p = 4 + 16 = 20이 되고, 최종적으로 x에는 16이 저장됩니다. 이 출력 결과는 두 함수 호출이 왼쪽에서 오른쪽 순서로 평가되었음을 의미합니다.

만약 컴파일러가 오른쪽부터 평가했다면 p = 16 + 4 = 20으로 덧셈 결과는 같지만, 연산 과정에서 x가 변하는 상황이라면 평가 순서에 따라 최종 값이 달라질 수 있습니다. 이처럼 부수 효과(side effect)가 있는 표현식에서는 피연산자 평가 순서를 항상 염두에 두어야 하며, 코드의 이식성을 높이려면 한 문장에서 동일한 변수를 여러 번 수정하지 않는 것이 좋습니다.