lvalue(좌변값)이란?

MySprtlty·2023년 1월 10일
2

Standard C

목록 보기
15/36

🏷️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)라고 한다.
profile
2Co 4:7

0개의 댓글