C언어 전치와 후치의 우선순위

전치와 후치에 배운지는 좀 지났지만, 그 당시에 궁금 했던것을 찾아 블로그에 남긴다.  

제목이 본론이브로 설명은 간단하게 하고 넘어간다.  C언어에는 ++, --를 이용해서 그 변수에 1을 더하거나 뺄 수 있다.

int main(void){
    int a = 0;
    a = a++;
    a = ++a;
    return 0;
}

여기서 ++, --는 같은 역할로 작동을 한다. 그럼 왜 두 가지가 존재하는 걸까?

#include <stdio.h>

int main(void){
    int a = 0;
    printf("%d",a++); /*0  a=1*/
    printf("%d",++a); /*2* a=2*/
    return 0;
}

이걸 보면 이해가 쉽다.

++a:
a먼저 ++뒤에

a++:
++먼저 a뒤에

이게 전치와 후치의 전부다.


근데 왜 후치가 전치보다 우선순위가 더 높지?

독학할때 이해가 정확히 안되었던것 중 하나고 그때는 영어를 못했지만 지금은 읽을줄 안다. 그래서 열심히 찾아봤다.

사실 괄호 잘쓰면 이런 궁금증 따위는 뭉개고 넘어가도 괜찮겠지만...
난 이해를 중요시 하며 이런곳에 호기심이 한번 생기면 끝까지 알아내야 한다.

정답 자체는 우선순위가 컴파일러마다 다르고 제발 괄호 써라 였다.

그러나 이런걸 알고 싶은게 아니므로 몇가지 지식을 이어붙여서, 전치와 후치의 우선순위가 그런식인 이유를 적어본다.

예시는 전부 증가 연산자(++)로 설정한다.

전치 연산자는 그냥 그 자리에 (변수+1)를 넣는것과 같다. 단지 다른 다항 연산자들보다 빨라야하는것 뿐.

문제는 후치 연산자다. 분명 연산은 원래 변수값대로 하고 그 줄을 넘어가면 변수+1값으로 변경되어야 한다. 그러나 잘 생각해보면, 일단 후치 연산자가 그 변수값을 제일 먼저 알아야한다. 그래야 그 값을 가져와서 더하거나 빼고 저장해 두었다가, 나머지 다른 연산이 끝나면 돌려 줄 수 있어야 하니까.

결론을 말하면 후치 연산자의 우선순위가 높은 이유는 그냥 그게 "후치 연산"을 하는지 알기 위해서 누구보다 먼저 연산되는것이다.


이 단순한 하나를 이해하기 위해 생각보다 열심히 검색해야 했어도 알고나서 속이 시원한게 역시 찾아보길 잘했다. 예전부터 이런 호기심 발동구간이 정말 많았어서 블로그 글 쓸건 많을것 같다. 오늘도 유용했다.