🏷️C언어의 lvalue
- C언어에서 lvalue란, 대상체(object)를 지정하는 수식이다.
- 🖇️cf. 대상체란 메모리의 영역을 의미한다. (흔히, 변수라고도 한다.)
- C언어에서 lvalue는 locator value의 약자이다.
- lvaule는 데이터 형을 갖는다.
- 지정하는 대상체에서 값(비트열)을 읽을 때(read), 값으로 바뀐다.
- 🖇️cf. 이 값을 rvalue라고 부르기도 한다.
- 비트열로 부터 값을 읽어올 때, lvalue의 데이터 형으로 값을 해석한다.
- 🖇️cf. 이는 같은 대상체를 지정하더라도 lvalue의 데이터 형이 다르면, 다른 값으로 해석해낼 수 있다는 것을 의미한다. (type punning)
- 값을 읽어올 때, 값 자체엔 형 한정자(type qualifier)가 의미가 없으므로 형 한정자는 제거된다.
- 🖇️cf. const나 volatile 같은 형 한정자는 대상체에 부여되는 속성이기 때문이다.
- 🔍ex) lvalue의 데이터 타입이 const int일 때, 읽어오는 값은 const가 제거된 int가 된다.
- 지정하는 대상체에 값을 쓰는(write) 문맥에서는 본연의 의미인 lvalue로 남는다.
- 가장 간단한 lvalue는 명칭만 있는 수식이다.
- 🔍ex)
int a;
선언에서 a
가 lvalue다.
🏷️고전적인 의미의 lvalue
- 일반적으로 lvalue는
=
(대입 연산자)의 좌측 피연산자 자리에 들어가는 수식을 뜻한다.
- 🖇️cf.
a = b
에서 a
가 고전적인 의미의 lvalue다.
- 따라서 자연스럽게 lvalue는 left value의 약자가 된다.
=
의 좌측 피연산자에 들어가는 수식이기에, 고전적인 의미의 lvalue는 언제나 수정이 가능하다.
- 이 고전적인 lvalue를 C언어에 그대로 적용하고 싶었지만, 문제가 있었다.
- 아래 예시처럼
=
의 좌측 피연산자에 배열이 들어가는 경우를 생각해보자.
- 🔍ex)
int a[3];
a = 10;
- 위 예시는 컴파일 오류를 발생시킨다.
- 배열
a
는 수정이 불가능하기에 고전적인 의미의 lvalue가 될 수 없다.
- 즉, C언어의 lvalue는 언제나 수정 가능한 것이 아니다.
- 위와 같은 모순을 해결하기 위해, C언어에서의 lvalue는 고전적인 의미의 lvalue와 다른 뜻을 갖게 되었다.
- 그리고 이를 구분하기 위해, 고전적인 의미의 lvaue를 C언어에서는 modifiable lvalue(수정 가능한 lvalue)라고 한다.