왜 전위 연산을 하는 버릇을 들이라고 했을까?

int i = 0;
 
++i;//⭐
i++//❗

두 가지 모두 +1이 저장되는 것은 맞을텐데 말이다.


내부 동작을 살펴보자.

전위연산

전위 연산은 선 연산, 후 대입이다. 즉, 우선 1을 더한 후 (연산) 더해진 값을 반환하는 것이다.(대입)

그렇기에 내부적으로 보면 다음과 같이 진행이 된다. (만약 연산자 오버로딩을 한다고 했을 때)

class Test{
public:
	Test(int i) : m_i(i){} // 생성자
	Test& operator++(){
		m_i += 1;
		return m_i;
	}
private:
	int m_i;
}

전위 연산자의 경우에는 자신의 내부 값에 +1 을 한 후에 자기 자신을 그대로 return하게 된다. 이때, 레퍼런스 타입으로 반환이 되기 때문에

int i = 0;
++(++i);

위와 같은 문법이 허용이 되는 것.

반면에

후위연산

후위 연산은 아래와 같이 구현이 되어 있다.

class Test{
public :
	Test(int i) : m_i(i){}
	Test operator++(int){
		Test Tmp(*this);
		m_i +=1;
		return Tmp;
	}
private:
	int m_i;
}

즉, 레퍼런스가 아니 R_value를 반환하기에 전위연산과 다르게

(i++)++;

와 같은 문법은 불가능할 뿐만 아니라, Test Tmp(*this);와 같이 임시 객체를 하나 더 만들어야 하기 때문에, 전위/후위의 구분이 크게 필요 없는 작업이라면 후위연산보다는 전위연산이 상대적으로 효율적이다.