PL/C++

lvalue와 rvalue의 이해, 증감연산자와 앰퍼센드 연산자

PIYA 2022. 7. 19.

lvalue와 rvalue의 이해, 증감연산자와 앰퍼센드 연산자

l-value와 r-value

left value와 right value를 의미하며,
int a = 3;
같은 식에서
왼쪽의 a가 l-value, 오른쪽이 r-value이다.


l-value: 식 이후에도 남아있는 값. 주소를 가지고있음.
r-value: 메모리 주소가 없고, 표현식 범위에만 있는 임시 값. 임시 변수!

예를들면
if(a<4) 같은 표현식에서 4는 r-value이다.

rvalue의 이해 - 다른 예시

int a=1;
int b=2;
int& c = a+b;

위의 식이 가능할까?
레퍼런스변수에는 rvalue를 넣을 수 없기때문에 안된다는 에러가 뜬다.
즉 a+b는 실제 변수가 아니라 임시값이다.
a와 b는 각각 lvalue지만 a+b는 rvalue가 된다.

rvalue의 이해 - 또다른 예시

int a = 1;
int b = a++;
int& c = a++; // r-value를 넣을 수 없다는 에러
int& d = ++a; // 이건 가능함

레퍼런스변수 c에서 a가 lvalue니까 대입되어야하지 않을까, 생각했지만 rvalue라 안된다는 에러가 뜬다.
실제 연산이 어떻게 돌아가는지를 이해하면 매우 좋다.

b에다가 a++을 대입하려하면 b에다 일단 a를 저장하고 1을 더하는 것이 아니라(X),
임시변수 rvalue를 만든 후, lvalue a를 저장하고, 이 rvalue를 b에다가 대입한 후, rvalue의 값을 1을 증가시키는 것이기 때문에
c에다가 a++을 넣을 수 없는것이다. rvalue이기때문에.

그럼 d의 케이스를 보자.
얘는 되는 이유가,
++a 연산자의 경우 작동원리가 다르기 때문이다.
lvalue인 a를 우선 1 증가시킨 후, 그 lvalue a를 그대로 넣기 때문에 d에 들어가는 것이다.

실제 ++연산자의 작동 순서, 원리를 이해할 수 있는 좋은 예시이다.

주소연산자 엠퍼센드(&)

주소연산자 &는 사실,
lvalue의 주소를 가져오는 것이다.
왜냐하면 rvalue는 주소가 없기 때문이다..

&(++a); // 가능.
&(a++); // 불가능, a++은 위에서 설명한 것처럼 lvalue이기 때문이다.

댓글