Notes for C

후위 증감연산자와 전위 증감연산자의 비밀

Sloth Coder 2022. 8. 17. 00:46

증감 연산자를 배울 때, 보통 후위(postfix) 증감연산자는 '할당 후', 즉  '연산자 우선 순위가 증감연산자에 비해 낮은 다른 연산 후' 연산을 하게 되고 전위(prefix) 증감연산자는 '할당 전', 즉 '연산자 우선 순위가 증감연산자에 비해 낮은 다른 연산 전' 연산을 하게 된다고 배운다(할당 연산자는 연산자 우선 순위가 증감 연산자에 비해 낮다). 이 포스트에서 우리는 도대체 왜 이런 현상이 발생하는지 알아보려고 한다.

 

 

 

 

<정말 후위 증감연산자는 연산자 우선순위가 자기보다 낮은 다른 연산 후에 연산을 수행하게 되는가?>

  • 잘 생각해보면 이는 굉장히 모순적인 문장이다. 예를 들면, 연산자 우선순위가 자신보다 낮은 '할당연산자'의 연산인 '할당' 이후에 후위 증감연산자가 연산을 수행하게 되는 것은 말이 안된다. 말 그대로, 후위 증감연산자가 연산자 우선순위가 더 높기 때문이다.
  • 그렇다, 사실 이는 틀린 말이다. 사실 후위 증감연산자는 할당 연산자보다 먼저 연산을 하게 된다. 당연하게도, 우선순위가 더 높기 때문이다. 단지 이러한 설명을 하는 이유는, 후위 증감연산자가 할당 연산자의 연산 후에 연산을 하는 것처럼 '보이기' 때문이다. 

 

 

<후위 증감 연산자의 작동 방식>

#include <stdio.h>

int postfix(int *num1){
    int temp;
    temp = *num1;
    *num1 = temp + 1;
    return temp;
}

int main()
{
    int num1 = 3;
    int a;

    a = postfix(&num1);

    printf("%d %d\n", a, num1); //결과: 3 4

    return 0;
}
  • 후위 증감연산자를 함수로 표현해 보면 위와 같은 코드가 된다. 먼저, num1의 주소값을 받아 와 temp라는 임시 저장소에 저장한다. 그 후 temp값에 1을 더한 값을 num1에 저장 해 준 후 temp값을 리턴한다. 그렇다, 후위 증감연산자의 연산순서는 사실 a라는 변수에 num1++의 값을 할당해 주기 위한 할당 연산자, 즉 후위 증감연산자보다 연산자 우선순위가 낮은 연산자에게 연산 우선순위가 밀리지 않았다. 후위 증감연산자의 연산은 할당 연산자보다 '먼저' 일어났다. 단지 후위 증감연산자는 연산 후 1이 증가한 num1값을 반환하는 것이 아니라 증가하기 전 num1값을 저장했던 변수 temp의 값을 리턴하기 때문에 마치 후위 증감연산자의 연산이 할당연산자보다 뒤로 밀린 것처럼 '보인 것'뿐이었던 것이다.

 

 

<전위 증감 연산자의 작동 방식>

#include <stdio.h>

int prefix(int *num1){
    *num1 += 1;
    return *num1;
}

int main()
{
    int num1 = 3;
    int a;

    a = prefix(&num1);

    printf("%d %d\n", a, num1); //결과: 4 4

    return 0;
}
  • 전위 증감연산자를 함수로 표현해 보면 위와 같은 코드가 된다. 먼저, num1의 주소값을 받아 오는 것까진 후위 증감연산자와 동일하다. 다른 점은, 전위 증감연산자는 temp라는 임시 저장소를 쓰지 않고 곧바로 num1에 1을 더해준 후 num1의 값을 리턴한다는 것이다. 따라서 a에는 3에 1을 더한 4가 들어가게 된다. 

 

 

 

<결론>

  • 후위 증감연산자와 전위 증감연산자는 위와 같은 특징때문에 간단한 설명만 들었을 때는 헷갈리기 쉽다. 특히, 후위 증감연산자와 전위 증감연산자가 복잡하게 섞여 나올 경우 더욱 그렇다. 왠만하면 후위 증감연산자와 전위 증감연산자는 간단하게 사용하도록 하자.
  • 함수의 인수로 변수를 넘겨줄 때 변수에 후위 증감연산자나 전위 증감연산자를 사용하는 경우에 주의할 점 또한 있지만, 이는 함수의 인자 처리 방식, 메모리 구조에 대한 이해가 필요하므로 따로 포스팅 하도록 하겠다. 다만 미리 말해두자면, 웬만하면 함수의 인수에는 증감연산자를 사용하지 않는 것이 좋다. 아니, 사용하지 말자.

'Notes for C' 카테고리의 다른 글

정수 자료형의 저장 방식과 scanf함수 사용시 주의할 점  (0) 2022.08.28
scanf 함수  (0) 2022.08.11
메모리 관련 함수  (0) 2022.08.07