Notice
Recent Posts
Recent Comments
공부중
[C++] 전위/후위 증가/감소 연산자 본문
반응형
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
위의 링크에 보면 lvalue와 prvalue 각각의 표현식에 대한 예가 적혀져 있다.
en.cppreference.com/w/cpp/language/operator_incdec#Built-in_postfix_operators
추가로 위의 링크에서 증가 감소 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;
}
반응형
'Programing > C, C++' 카테고리의 다른 글
[C/C++] 자료형의 크기에 대하여.. (0) | 2021.02.24 |
---|---|
[C/C++] 정수와 실수의 표현방식 (0) | 2021.02.24 |
[C++] Lvalue Rvalue (0) | 2020.11.17 |
[C/C++] Right to Left Rules(오른쪽-왼쪽 규칙) (1) | 2020.11.14 |
[C++] const 위치에 따른 상수화 되는 대상 (0) | 2020.11.09 |