C Language/C언어 기초

<C언어 - 기초> 전위(++a), 후위(a++) 연산자의 차이점에 대해 알아 보자!

WooJi 2022. 5. 1. 06:43
반응형

안녕하세요.

WooJi입니다.

 오늘은 C언어에서의 전위 연산자와 후위 연산자에 대해 말해볼까 합니다.

우선 내용에 오류가 있을 수 있음에 양해 부탁드리며 오류를 발생하시면 댓글 등으로 알려주시기 바랍니다.

 

 C언어에 대한 첫 글이 전위,후위 연산자라는 특정 연산자인 이유는 처음 배운다면 많이 헷갈릴 부분이고 사실 시험에서 틀렸거든요,,,,, 복습하는 차원에서 먼저 써봅니다.

C언어의 변수 선언, 초기화, 헤더파일 등 기초적인 부분은 차차 다루도록 하겠습니다.


 우선 연산자에 대해 간단히 알아봅시다.

우리가 흔히 연산식이라 부르는 2+3=5, 2*3=6 등은 2,3과 같은 피연산자와 +,*와 같은 연산자로 나뉩니다.

모든 연산자는 조건,기능,결과가 존재합니다.

무슨 말이냐 하면 a = 2; 와 같이 a라는 변수에 2를 대입할 때 사용되는 대입(=) 연산자는 조건이 대입 연산자의 왼쪽(좌항)은 modifiable l-value, 즉 수정가능해야 한다는 것입니다. 기능은 우항의 값을 왼쪽 변수에 저장하는 것, 결과는 변수에 저장된 값이 되는 것입니다.

 

연산자는 이 정도로 알아보고 전위, 후위 연산자로 넘어가 봅시다.

 

전위 연산자(prefix operator)

  • 정의: 증감 연산자(+ or -)를 변수의 앞에 사용한 것
  • 조건: modifiable l-value (수정 가능한 변수 공간)
  • 기능: 변수 공간의 값을 1 증가 or 감소
  • 결과: 1 증가 or 감소된 변수 공간의 값

기능과 결과가 같은 것 아니냐고요? 맞습니다. 전위 연산자에 한해서 말이죠

후위 연산자도 알아봅시다.

 

후위 연산자(postfix operator)

  • 정의: 증감 연산자(+ or -)를 변수의 뒤에 사용한 것
  • 조건: modifiable l-value(수정 가능한 변수 공간)
  • 기능: 변수 공간의 값을 1 증가 or 감소
  • 결과: 변수 공간 자체의 값

후위 연산자는 기능과 결과가 다른 것을 알 수 있네요.

 

"그럼 도대체 무슨 역할이냐?"라고 궁금 해들 하실 것 같아 보여드리겠습니다.

#include <stdio.h>

int main()
{
    int a,b,c,d;
    a = 1;
    b = 2;
    c = ++a;
    d = b++;

    printf("%d %d %d %d\n",a, b, c, d); //2 3 2 2 가 출력된다.

    return 0;
}

변수 c에 ++a값을 대입하였는데 a는 변수 공간으로 수정 가능하기 때문에 전위 연산자를 사용할 수 있습니다.(조건)

결과에 의하여 1 증가된 2가 c에 저장되고 기능에 의하여 a의 변수 공간 값이 2가 됩니다. 

따라서 a는 2, c도 2이기 때문에 모두 2가 출력되는 것입니다.

 

변수 d는 b++값을 대입하였는데 b 역시 변수 공간으로 수정 가능하기 때문에 후위 연산자를 사용할 수 있습니다. (조건)

다만 결과에 의하여 d에는 b 자체 값이 저장되므로 2가 저장될 겁니다. 이후 기능에 의하여 b값이 1 증가한 3이 되기 때문에 b는 3, d는 2가 출력되는 것입니다.

 

이해하셨나요??

이 코드에 대한 결과를 이해할 수 있는지 확인해봅시다.

#include <stdio.h>

int main()
{
    int a,b,c,d,e,f;
    a = 3;
    b = 5;
    c = ++a + ++b;
    d = a++ + ++b;
    e = a++ + b++;
    f = ++a + b++;

    printf("%d %d %d %d %d %d\n",a, b, c, d, e, f);  //7 9 10 11 12 15 가 출력된다.

    return 0;
}

코딩은 결과를 단순히 받아보는 것에서 끝나지 않고 결과를 보기 전 어떻게 나올지 예상해보는 과정에서 실력이 는다고 생각합니다. 밑의 해설을 읽기 전 생각해보시고 밑의 더보기를 눌러 답을 확인해보시기 바랍니다.


더보기

c는 모두 전위 연산자이므로 4+6이므로 10

d는 a가 후위 연산자이므로 4, b가 전위 연산자이므로 7 -> 4+7 = 11 / 다만 a값이 이후 5가 됨에 유의

e는 a, b 모두 후위 연산자이므로 5+7 = 12 / 이후 a = 6, b = 8

f는 앞의 원리에 의해 7+8 = 15/ a = 7, b = 9

 

그런데 하다 보면 전위 연산자는 연산과 동시에 1 증감하는 것을 알겠는데 후위 연산자는 d의 경우에서와 같이 d의 값을 계산할 때는 a 자체가 되어 저장되고 그 후에 코드 한 줄이 넘어갈 때쯤 기능에 의해 1 증가하는 것에 의문이 들 수 있습니다.  기능에 의하여 1 증가하는 타이밍이 언제일지에 대해서 제 교수님께서는 컴파일러마다 다르기 때문에 정확히 나눌 수는 없다고 하셨기에 언제다!라고 하기는 힘듭니다. 다만 보통 기준을 한 줄로 잡고 생각하면 거의 맞는 것 같습니다.


전위, 후위 연산자의 기능과 결과에 집중하여 다뤄보았습니다.

이것 말고도 아직 할 말이 많네요. 글이 길어지기에 다음에 이어서 하도록 하겠습니다. 일단 너무 졸려요(새벽 6시 반,,,)

모르시는 부분이 있거나 오류가 있으면 댓글로 알려주시기 바랍니다.

처음이라 서툰 글이지만 읽어주셔서 감사드립니다.

반응형