lvalue와 rvalue란?
C 언어에서 모든 표현식(expression)은 lvalue 또는 rvalue 중 하나로 분류됩니다. 이 두 개념을 정확히 이해하면 대입 연산과 관련된 컴파일 오류의 원인을 쉽게 파악할 수 있습니다.
lvalue(locator value)는 메모리상에서 식별 가능한 위치, 즉 주소를 가지는 객체를 의미합니다. 반면 rvalue는 배제적으로 정의되는데, 메모리에서 식별 가능한 위치를 차지하지 않는 표현식을 뜻합니다.
대입 연산과 lvalue
대입 연산자(=)는 왼쪽 피연산자로 반드시 lvalue를 요구합니다. 따라서 다음 코드는 유효합니다:
int i = 10;
그러나 아래 코드는 유효하지 않습니다:
int i;
10 = i; // 컴파일 오류 발생
왜 '10 = i'는 오류일까?
변수 i는 메모리에 실제 주소를 가지고 있으므로 lvalue입니다. 반면 상수 10은 식별 가능한 메모리 위치가 없기 때문에 rvalue입니다. 따라서 변수 i의 값을 10에 대입하는 것은 논리적으로 아무런 의미가 없으며, 컴파일러는 이를 오류로 처리합니다.
쉽게 구분하는 방법
주소 연산자(&)를 적용할 수 있는지 확인하면 두 값을 간단히 구분할 수 있습니다. 예를 들어 &i는 유효하지만 &10이나 &(i + 1)은 유효하지 않습니다. 즉, 이름을 가진 변수나 역참조된 포인터는 대체로 lvalue이며, 숫자 리터럴이나 연산의 결과값은 rvalue입니다.