공부중

[C++] 전위/후위 증가/감소 연산자 본문

Programing/C, C++

[C++] 전위/후위 증가/감소 연산자

곤란 2020. 11. 18. 00:10
반응형
int a = 10;
++a;	// 전위 증가연산자
--a;	// 전위 감소연산자
a++;	// 후위 증가연산자
a--;	// 후위 감소연산자

전위 증가/감소 연산자는 위와같이 쓸 수 있다.

여기서 특이사항은 전위 연산자는 증가/감소 연산을 먼저 처리하는것이고

후위 연산자는 증가/감소 연산을 나중에 처리하는것이다.

 

여기까지는 아무런 문제가 없고 잘 사용하면 그만인데...

아래와 같은 문제를 받은적이 있었다.

int a = 10;
int b = 20;

(++a) = 50;
(b++) = 70;
++(++a);
(b++)++;

증감 연산자에 뭔가 변태적까지는 아니지만 그래도 이건 좀 불편한 코드라는것은 다르지 않다.

여기서 나는 당당하게도

50
71
52
72

가 출력될줄 알았다..

 

하지만 결과는 아래와 같았다.

int a = 10;
int b = 20;

(++a) = 50;		//50
(b++) = 70;		// 컴파일 에러 error C2106: '=': 왼쪽 피연산자는 l-value이어야 합니다.
++(++a);		//52
(b++)++;		// 컴파일 에러 error C2105: '++'에 l-value가 필요합니다.

결과만 보자면 후위 연산자의 결과는 prvalue의 사본이 되므로 l-value가 아니니까 컴파일 에러가 난다.

en.cppreference.com/w/cpp/language/value_category

 

Value categories - cppreference.com

Each C++ expression (an operator with its operands, a literal, a variable name, etc.) is characterized by two independent properties: a type and a value category. Each expression has some non-reference type, and each expression belongs to exactly one of th

en.cppreference.com

위의 링크에 보면 lvalue와 prvalue 각각의 표현식에 대한 예가 적혀져 있다.

 

en.cppreference.com/w/cpp/language/operator_incdec#Built-in_postfix_operators

 

Increment/decrement operators - cppreference.com

Increment/decrement operators increment or decrement the value of the object. Operator name Syntax Over​load​able Prototype examples (for class T) Inside class definition Outside class definition pre-increment ++a Yes T& T::operator++(); T& operator++(

en.cppreference.com

추가로 위의 링크에서 증가 감소 operators에 관한 글을 읽어볼 수 있다. 내용을 조금 읽어보자면..

전위 연산의 경우 표현식 ++x 는 x += 1과 정확히 동일하고 --x 표현식은 x-=1과 정확히 동일하다.

접두사 증가 또는 감소는 수정된 피연산자를 식별하는 lvalue표현식이다.

후위 연산의 결과는 피연산자의 원래 값의 prvalue 사본이다.

 

코드로 표현해 보자면..?

class Int
{
public:
    Int(int val) { _i = val; }
    Int& operator++();
    const Int operator++(int n);
private:
    int _i;
};

Int& Int::operator++()
{
    _i++;
    return *this;
}

const Int Int::operator++(int)
{
    Int temp = *this;
    ++*this;
    return temp;
}

 

 

 

반응형