JS 증감연산자

김동현·2024년 2월 12일
1

NodeJS

목록 보기
4/6
post-thumbnail

V8

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& vs WrappedIterator

위의 코드 예제에서 전위 증가 및 전위 감소 연산자는 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;
}

💡 자기 자신 또는 복제본
즉, 전위 증감 연선자와 후위 증감 연산자는,
자기 자신을 반환하는 것 인지 아닌지의 차이이다.

JS에서 증감 연산자

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 을 뜯어보자

  1. 복제본을 만든다.
  2. 내부적으로 자기 자신에 1을 더한다.
  3. 복제본을 반환한다.
  4. 복제본 값에 1을 더한다.
  5. i에 다시 대입한다.
    • ⚠️ 즉, 2번 자기 자신에 1을 더하는 것은 안하는 것과 같은 것이다!

참고자료

profile
달려보자

0개의 댓글