operator_incdec — 증감 연산자

operator_incdec — 증감 연산자 (Increment/decrement operators)

**증감 연산자(increment/decrement operator)**는 값을 1씩 증가/감소시키는 ++-- 연산자예요. 전위(prefix)와 후위(postfix) 두 형태가 있어요.

루프 카운터나 반복자 이동에 흔히 사용해요. 전위와 후위는 값이 달라져요.

출처: cppreference

본문

증감 연산자는 피연산자를 1 증가/감소시켜요.

문법 (Syntax)

++x    // 전위 증가
x++    // 후위 증가
--x    // 전위 감소
x--    // 후위 감소

전위 vs 후위

  • 전위(prefix) ++x — 값을 증가시키고 증가된 결과를 반환해요.
  • 후위(postfix) x++ — 값을 증가시키지만 증가 이전의 값을 반환해요.
int x = 5;
int a = ++x;   // x 는 6, a 는 6  (전위)
int b = x++;   // x 는 7, b 는 6  (후위)

반복자와 사용

STL 반복자에서 ++it(전위)는 it++(후위)보다 효율적일 수 있어요(후위는 이전 값을 복사해야 할 수 있음). 관례상 전위 증가가 선호돼요.

for (std::vector<int>::iterator it = v.begin(); it != v.end(); ++it) { }

오버로딩

클래스에서 operator++, operator--를 오버로드할 수 있어요. 전위와 후위는 구분돼요.

  • 전위: T& operator++();
  • 후위: T operator++(int); (더미 int 인자)
class Counter {
    int n = 0;
public:
    Counter& operator++() { ++n; return *this; }  // 전위
    Counter operator++(int) { Counter c = *this; ++n; return c; }  // 후위
};

정수형에서의 주의

int i = 5; i = i++ + ++i;처럼 같은 변수를 순서 없이 수정과 읽는 코드는 정의되지 않은 동작이에요. 같은 객체를 두 번 수정하는 표현을 피해야 해요.

노트 (Notes)

  • 후위 연산자는 증가 전 값의 사본을 만들어 내므로 약간의 오버헤드가 있을 수 있어요 (사용자 타입).
  • 반복자·포인터에도 ++/--를 쓸 수 있어요.
  • 불필요하게 평가 결과를 사용하지 않으면 전위를 쓰는 게 관례예요.

더 알아보기 (Learn more)

cppreference