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

C 언어 printf 함수에서 증감 연산자(++)의 평가 순서 완벽 이해하기

C 언어 학습이나 필기 시험 문제를 풀다 보면 printf() 문 안에 증감 연산자(++)가 포함된 코드를 만나는 경우가 많습니다. 이런 유형의 문제는 코드의 출력 결과를 예측하는 능력을 테스트하기 위해 자주 출제됩니다. 이 글에서는 대표적인 예제를 통해 printf() 함수가 인수를 어떤 순서로 평가하는지 살펴보고, 정확한 출력 결과를 이해해 보겠습니다.

예제 코드

#include<stdio.h>
int main() {
   volatile int x = 20;
   printf("%d %d\n", x, x++);
   x = 20;
   printf("%d %d\n", x++, x);
   x = 20;
   printf("%d %d %d ", x, x++, ++x);
   return 0;
}

과연 출력 결과는 무엇일까요? 대부분의 컴파일러는 printf() 함수의 각 인수를 오른쪽에서 왼쪽으로 평가합니다. 따라서 첫 번째 printf() 문에서는 마지막 인수인 x++가 가장 먼저 실행됩니다. 후위 증가 연산자(x++)는 현재 값 20을 먼저 사용한 뒤 값을 21로 증가시키므로, 이후 두 번째 인수인 x에는 21이 전달됩니다. 그 결과 "21 20"이 출력됩니다. 나머지 printf() 문도 모두 같은 방식으로 계산됩니다.

여기서 두 연산자의 차이를 명확히 구분하는 것이 중요합니다. 후위 증가 연산자(x++)는 값을 먼저 사용한 후 1을 증가시키고, 전위 증가 연산자(++x)는 값을 먼저 1 증가시킨 후 사용합니다. 이 차이만 정확히 이해하면 복잡해 보이는 코드도 쉽게 분석할 수 있습니다.

아래 출력 결과를 직접 확인하면서 앞의 설명을 다시 한번 따라가 보면 훨씬 쉽게 이해할 수 있습니다.

출력 결과

21 20
20 20
22 21 21

결과 분석

  • 첫 번째 출력(21 20): x++가 먼저 평가되어 20을 전달하고 x는 21이 된 뒤, x가 21을 전달합니다.
  • 두 번째 출력(20 20): x가 먼저 20을 전달하고, 이후 x++가 20을 전달한 뒤 x는 21이 됩니다.
  • 세 번째 출력(22 21 21): ++x가 먼저 x를 21로 만들어 21을 전달하고, x++가 21을 전달한 뒤 x는 22가 되며, 마지막으로 x가 22를 전달합니다.

참고로, C 표준에서는 시퀀스 포인트 사이에서 동일한 변수를 여러 번 수정하는 것을 정의되지 않은 동작(undefined behavior)으로 규정합니다. 따라서 위 결과는 GCC 등 대부분의 컴파일러가 인수를 오른쪽에서 왼쪽으로 평가할 때 나타나는 결과이며, 컴파일러나 최적화 옵션에 따라 출력이 달라질 수 있다는 점도 함께 기억해 두는 것이 좋습니다.