본문 바로가기
프로그래밍/공부

[C++] Lvalue & Rvalue

by Sik.K 2023. 4. 22.

컴퓨터가 특정 값을 요구할 때, 우리는 흔히 변수를 선언해 값을 대입해서 이용한다.

 

int a = 10;

 

위와 같은 형태로 많이 사용하는 데 C언어에서는 Lvalue와 Rvalue는 쉽게 말하면 대입 연산자를 기준으로 좌측에 존재하는 것을 Lvalue, 우측에 존재하는 것을 Rvalue라고 한다.

 

하지만 C++에 들어와서는 조금 의미가 변했다.

 

좀 더 깊게 파고 들어가면 Lvalue는 변할 수 있는 것들, 주소를 할당 받아 정의 이후에 사라지지 않는 값, 즉 변수를 의미한다. int형 변수 a는 int 값이 담기지만 그 내부의 값은 변한다. 10을 대입하면 a는 10이고, 20을 대입하면 a는 20이다. a는 해당 구문을 벗어나도 사라지지 않으며 해당 스코프가 사라질 때까지 존재한다.

 

이처럼 Lvalue는 대입이 가능해서 언제든 변할 수 있는 값들을 의미한다.

 

이와 반대로 Rvalue는 10, 40, "name"과 같은 상수 값, 혹은 임시변수를 의미한다. 변하지 않고 대입하기 위해 임시로 적는 값들이기 때문에 특정 메모리 공간을 할당 받지 않고 해당 구문을 벗어나는 순간 사라진다.

 

그렇다면 다음과 같은 경우는 어떨까?

 

int a = b++;

 

이 경우 우리는 a라는 변수에 b의 값을 넣고, b의 값을 증감연산자로 1 증가시킨다. 이런 매커니즘으로 알고 있다. 하지만 좀 더 정확하게 표현하면, 우선 b라는 값을 복사한 임시변수를 생성하고 b의 값을 증가, 이후 임시변수를 a에 대입한다. 이런 매커니즘으로 작동한다.

 

int a = 0;
a++; // Rvalue
++a; // Lvalue

 

위의 경우 증감연산자가 후위에 있으면 Rvalue이고 전위에 있으면 Lvalue이다. 조금 감이 제대로 오지 않아 정확하게 살펴보았는데 전위에 있을 경우 증가한 자기 자신을 return하기 때문에 Lvalue가 되는 것이고, 후위에 있을 경우에는 a의 값을 복사한 임시변수를 리턴하고, 이후에 a의 값을 증가하는 것이기 때문이다.

'프로그래밍 > 공부' 카테고리의 다른 글

[C++] 포인터  (0) 2023.05.04
[C++] & Reference  (0) 2023.04.22
[C++] 바이트 패딩  (0) 2023.04.20
[Game] DirectX11 모작 - 포켓몬스터 - 1  (0) 2023.04.02
[Game] DirectX11 모작 - 포켓몬스터  (0) 2023.02.07

댓글