c 언어에서는 l-value 와 r-value 두가지의 문법적인 요소가 존재함.
l-value(left-value, Locator- value)
: object의 위치값이라는 의미가 됨.
l-value는 object를 표기할 수 있는 것을 말함. (void타입의 object 제외)
int a = 10;
a라는 것은 10이라는 값이 들어있는 메모리 공간인 object를 의미.
식별자 a라는 것이 10이 들어있는 object를 표기하기 위해 사용된다는 것을 의미.
int*p = &a;
*p 포인터 변수 p 또한 10이라는 값이 들어있는 object를 표기할 수 있음.
따라서 *p또한 l-value로 표현할 수 있음.
p[0]도 *p 와 동일하므로 같은 이유로 l-value임.
p[10] 또한 lvalue 이지만 p+10은 object를 가리키고 있지 않을 수 있음.
존재하지 않는 object를 표기하는 것이니 *(p+10) 또한 lvalue
그리고 이러한 lavalue를 사용하는 것은 미정의 동작(undefined behavior)
r-value(right-value, value fo an expression)
식을 계산한 후의 값이라는 의미가 됨
예를 들면 1 + 2 라는 식을 계산한 결과값은 rvalue
1 + 2를 게산한 결과값인 3이 메모리의 어디에 위치하는지 c언어에서는 알 방도가 없음.
분명 1+2의 계산 후 결과값이 메모리 어디엔가 들어있게 될것
즉, 1 + 2를 계산한 후의 결과값인 3을 저장하고 있는 object는 어디엔가 존재할 것임.
하지만, rvalue는 object 안에 들어있는 값만을 의미하기 때문에 rvalue로는 object 안에 들어있는 값에
대한 것을 제외하고는 object 에 대한 정보를 알 수가 없음.
c언어로 프로그래밍을 하는 한 1 + 2 의 결과물이 메모리의 어디에 위치하게 될지 계산하는
프로그램을 만들 수 없다는 의미임.
int a = 5;
상수 5 자체도 rvalue, 5라는 상수가 어디에 위치하는지 c언어에서는 모름
분명 5라는 상수도 메모리 어디엔가 위치하고 있음. 즉 상수 5에 대한 object는 존재함.
하지만 rvalue는 object가 아닌 object안에 저장되어있는 값만을 의미함.
이렇게 lvalue는 값이 들어있는 공간의 위치값을 가지고 있는 반면,
rvalue는 값이 들어있는 공간의 위치값을 가지고 있지 않음.
---
그런데 모든 lvalue가 대입연산자의 왼쪽에 올 수 있는 것은 아님.
c89 표준부터 const 키워드가 나오고, modifiable lvalue 규칙이 추가됨.
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=han95173&logNo=220765490854
'Language > C & C++' 카테고리의 다른 글
Exception handling (0) | 2022.10.14 |
---|---|
Implement reference-based call-by-reference (0) | 2022.09.28 |
Class (0) | 2022.09.26 |
BankingSystemver01.cpp (0) | 2022.09.26 |
C++ (0) | 2022.09.24 |