V8엔진에 operator++
, operator--
를 검색해보면 두 가지 케이스가 등장한다.
로직을 보면 아래와 같은데 반환 값에 &
주소 연산자가 붙어 있거나 안 붙어 있는 것을 볼 수 있다.
// 전위 증가 연산자
constexpr WrappedIterator`&` operator++() noexcept {
++it_;
return *this;
}
// 후위 증가 연산자
constexpr WrappedIterator operator++(int) noexcept {
WrappedIterator result(*this);
++(*this);
return result;
}
//전위 감소 연산자
constexpr WrappedIterator`&` operator--() noexcept {
--it_;
return *this;
}
// 후위 감소 연산자
constexpr WrappedIterator operator--(int) noexcept {
WrappedIterator result(*this);
--(*this);
return result;
}
위의 코드 예제에서 전위 증가 및 전위 감소 연산자는 WrappedIterator&
을 반환하여 원본 객체를 참조하여 수정할 수 있게 한다!
하지만 후위 증가 및 후위 감소 연산자는 새로운 WrappedIterator
를 생성하여 반환하는 것을 볼 수 있다.
즉, 반환 타입에 붙어 있는 &
는 참조를 반환
한다는 의미이다. 그렇지 않으면 복사본
을 반환한다!
#include<bits/stdc++.h>
using namespace std;
int g_test = 0;
int& getNumberReference()
{
return g_test;
}
int getNumberValue()
{
return g_test;
}
int main()
{
int& n = getNumberReference();
int m = getNumberValue();
n = 10;
cout << g_test << endl; // 10
g_test = 0;
m = 10;
cout << g_test << endl; // 0
return 0;
}
💡 자기 자신 또는 복제본
즉, 전위 증감 연선자와 후위 증감 연산자는,
자기 자신을 반환하는 것 인지 아닌지의 차이이다.
JavaScript
에서도 똑같다.
아래의 코드를 보자
let i = 1;
console.log("1: ", i); // 1
i = (i++) + 1;
console.log("2: ", i); // 2
i = (++i) + 1;
console.log("3: ", i); // 4
i = (i++) + 1;
console.log("4: ", i); // 5
i = (++i) + 1;
console.log("5: ", i); // 7
console.log((++i) === i); // true
console.log((i++) === i); // false
전위 연산자는 1을 더한 뒤 자기 자신을 반환
하기 때문에 2씩 증가하는 모습을 보인다.
후위 연산자는 복제본을 만들고, 자기 자신에 1을 더한 뒤, 복제본을 반환하기에 결과적으로 1이 증가
되는 모습을 보인다.
i = (i++) + 1
i = (i++) +1
을 뜯어보자
i
에 다시 대입한다.