lvalue와 rvalue 질문드립니다.
글쓴이: 익명 사용자 / 작성시간: 월, 2017/03/27 - 3:31오전
c++ 책을 보다 보니
이런 용어가 자주 나오는데요
같은 변수라도 대입의 좌측이나 우측에 오면 의미가 달라지나요?
var = var;
이런식으로
대입의 좌측에 오게 되면 특정 메모리공간을 나타내고
우측에 오면 그 메모리 공간에 있는 값을 나타내는 건가요?
아니면 둘다 동일하게 값을 나타내고
단지 변수는 좌측값도 되고 우측값도 될수 있는 ( 대입의 좌우측에 올수 있는 )
개념인건가요?
여러 책을 보아도 다소 애매하게 설명해 놔서 궁금해서 질문 드립니다..
Forums:
뭐 대충은
뭐 대충은
x = 1 + y;
이렇게는 되지만 (x는 lvalue, 1 + y 는 rvalue)
x-1 = y;
이렇게는 안된다는 말이지요,
즉 위치상 lvalue가 x-1가 되어야 하는데 이게 하나의 값을 저장할 수 있는
변수가 아니라서요.
lvalue는 프로그래밍언어론 용어로써, 그 어원을
lvalue는 프로그래밍언어론 용어로써, 그 어원을 따져 보면 "대입문의 왼쪽에 올 수 있는 값"입니다.
물론 그런 정의는 일반론적인 것이고, C++으로 범위를 좁히면 C++언어 표준 자체가 lvalue 및 rvalue의 정의를 나름대로 구체화 해 놨습니다. 표준답게 뭐라 이의를 제기할 수 없을 정도로 구체화시켜놨긴 했는데 문제는 거의 원소나열법 수준이라는 거죠.
예컨대 표현식
E
가T *
타입이라면 표현식*E
는T
타입의 lvalue이다, 하는 식의 규칙들이 잔뜩 있습니다. 따라서 C++ 코드를 갖다 주면 어떤 표현식이 lvalue인지 rvalue인지 알 수 있는 방법은 있지만, lvalue와 rvalue가 어떤 개념인지에 대한 인간 친화적인 설명은 없는 것이지요. 다양한 책 저자들이 나름대로 최대한 노력해서 채워넣으려고 하기는 했는데, 아무래도 저자의 역량에 달린 문제 아니었을까요.그나마 설명이 잘 된 책을 한 권 꼽으라면 C++의 창시자 Bjarne Stroustrup께서 쓰신 The C++ Programming Language 4판을 꼽겠습니다. 이 책을 읽는 것도 사실 만만치 않고 상당한 수준의 C++ 기반지식을 요구합니다만 표준 읽는 것보다는 열 배쯤 낫습니다. 최근에 번역서가 나오긴 했는데 제가 6만원쯤 주고 사서 보니 오역투성이더군요. 단순 오타 수준이 아니라 서술을 정반대로 뒤집어 놔서 되려 오해를 불러일으키는 수준의 오역이 심심찮게 나오는 수준이라 도저히 권장 못해드리겠습니다. 일정 이상 수요층이 확실히 보장되는 책인데 왜 이런 꼴으로 내 놨는지 원.
아무튼 그래서 사실 제 수준에서도 질문자님이 100% 만족하실 만한 답을 쓸 수는 없고 다만 단편적인 의문에만 대답해 드리겠습니다.
1. 같은 변수라도 대입의 좌측이나 우측에 오면 의미가 달라지나요?
글쎄요. 아 다르고 어 다르다고, 저는 변수의 의미가 달라진다기보다는 대입문에서의 역할이 다르다고 해석하는 걸 더 선호합니다. 대입문에서 왼쪽과 오른쪽 피연산자의 역할을 결정하는 것이 바로 대입 연산자의 의미론(Semantics)이지요.
var = var
에서 오른쪽 피연산자var
의 값을 왼쪽 피연산자var
에 대입하는 것이 대입 연산자의 실행 방식인 것입니다.2. 단지 변수는 좌측값도 되고 우측값도 될수 있는 ( 대입의 좌우측에 올수 있는 ) 개념인건가요?
C++에서 표현식은 반드시 lvalue, rvalue 중 하나입니다. 둘 다일 수는 없습니다. C++11에서는 glvalue이니 prvalue이니 하는 추가적인 분류가 더 들어가긴 합니다만, 그래도 위 진술은 여전히 유효합니다.
var
이 변수라면, 표현식var
은 lvalue입니다. 대입 연산자는 왼쪽 피연산자가 반드시 modifiable lvalue일 것을 요구하지만, 오른쪽 피연산자에는 그런 종류의 제약 조건이 없습니다. 따라서var = var
은 유효한 표현식입니다. 두 가지 사항에 주목하세요.1) 아무 lvalue나 대입문의 왼쪽에 올 수 있는 것은 아닙니다. modifiable lvalue에 주목하세요. 예컨대
var
이const
라면 대입문의 왼쪽에 올 수 없겠죠.2) 이러한 관점에서 볼 때, rvalue란 대입문의 오른쪽 피연산자가 될 수 있는 표현식이 아니라, 대입문의 왼쪽 피연산자가 될 수 없는 표현식이라고 생각하시는 게 조금 더 정확하겠습니다.
답변 감사드립니다..
도움이 되었습니다..
댓글 달기