문제
공부하다가 아래의 두 코드를 실행했는데 결과가 동일하게 출력됐다.
#include <stdio.h>
int main(void) {
int i;
i = 0;
while (i < 5)
{
++i;
printf("%d\n", i);
}
}
// 출력 결과 1 2 3 4 5
#include <stdio.h>
int main(void) {
int i;
i = 0;
while (i < 5)
{
i++;
printf("%d\n", i);
}
}
// 출력 결과 1 2 3 4 5
전위연산자 & 후위연산자
그래서 그럼 대체 뭐가 다른 건지 알아보니 아래와 같다.
- 전위연산자(++i): 연산자가 피연산자 앞에 위치하는 연산자, 먼저 값을 증가시키거나 감소시킨 후에 그 값을 사용, 예를 들어 ++i는 i의 값을 1 증가시킨 후에 그 값을 반환
- 후위연산자(i++): 연산자가 피연산자 뒤에 위치하는 연산자, 현재 값을 사용한 후에 값을 증가시키거나 감소시킴, 예를 들어 i++는 현재 i의 값을 사용한 후에 i의 값을 1 증가시킴
두 코드의 출력 결과가 같은 이유
두 코드 모두 i라는 변수를 0으로 초기화하고, i가 5보다 작을 동안 반복하며 i의 값을 출력하는 동작을 수행한다. 다만, i를 증가시키는 부분에서 전위연산자(++i)와 후위연산자(i++)를 사용하는 방식이 다르다.
전위 연산자(++i)를 사용한 경우:
- printf 함수 호출 시점에 i의 값이 이미 1 증가된 상태이고, printf 함수는 증가된 i의 값을 출력
- 출력되는 값은 1, 2, 3, 4, 5가 됨
후위 연산자(i++)를 사용한 경우:
- printf 함수 호출 시점에 i의 값은 아직 증가되지 않은 상태, printf 함수는 증가되기 전의 i의 값을 출력
- printf 함수 호출 후에 i의 값이 1 증가
- 다음 반복에서 i의 값이 증가된 상태로 사용되므로, 출력되는 값은 1, 2, 3, 4, 5가 됨
두 코드에서 printf 함수는 한 번의 반복마다 한 번씩 호출되며, 각 호출 시점에서 i의 값이 출력된다. 전위 연산자를 사용하든 후위 연산자를 사용하든, printf 함수가 호출될 때마다 i의 값은 그 이전 반복에서 1 증가된 상태이기 때문에 동일한 결과가 출력된다.
즉, 이 두 코드에서는 printf 함수가 호출되는 시점이 증감 연산자가 적용되는 시점과 일치하기 때문에 전위 연산자와 후위 연산자의 차이가 출력 결과에 영향을 미치지 않는다.
출력 결과에 영향을 주는 경우
int x = 10;
int y = x++; // y는 10, x는 11
int z = ++x; // z는 12, x는 12
위 예시에서 볼 수 있듯이, 후위 연산자는 현재 값을 사용한 후에 증가시키고, 전위 연산자는 먼저 값을 증가시킨 후에 사용한다. 따라서 연산자의 위치에 따라 결과가 달라질 수 있다.