lvalue와 rvalue 질문드립니다.

익명 사용자의 이미지

c++ 책을 보다 보니

이런 용어가 자주 나오는데요

같은 변수라도 대입의 좌측이나 우측에 오면 의미가 달라지나요?

var = var;

이런식으로

대입의 좌측에 오게 되면 특정 메모리공간을 나타내고

우측에 오면 그 메모리 공간에 있는 값을 나타내는 건가요?

아니면 둘다 동일하게 값을 나타내고

단지 변수는 좌측값도 되고 우측값도 될수 있는 ( 대입의 좌우측에 올수 있는 )

개념인건가요?

여러 책을 보아도 다소 애매하게 설명해 놔서 궁금해서 질문 드립니다..

parkon의 이미지

뭐 대충은
x = 1 + y;
이렇게는 되지만 (x는 lvalue, 1 + y 는 rvalue)
x-1 = y;
이렇게는 안된다는 말이지요,
즉 위치상 lvalue가 x-1가 되어야 하는데 이게 하나의 값을 저장할 수 있는
변수가 아니라서요.

 의 이미지

lvalue는 프로그래밍언어론 용어로써, 그 어원을 따져 보면 "대입문의 왼쪽에 올 수 있는 값"입니다.

물론 그런 정의는 일반론적인 것이고, C++으로 범위를 좁히면 C++언어 표준 자체가 lvalue 및 rvalue의 정의를 나름대로 구체화 해 놨습니다. 표준답게 뭐라 이의를 제기할 수 없을 정도로 구체화시켜놨긴 했는데 문제는 거의 원소나열법 수준이라는 거죠.

예컨대 표현식 ET * 타입이라면 표현식 *ET 타입의 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에 주목하세요. 예컨대 varconst라면 대입문의 왼쪽에 올 수 없겠죠.

2) 이러한 관점에서 볼 때, rvalue란 대입문의 오른쪽 피연산자가 될 수 있는 표현식이 아니라, 대입문의 왼쪽 피연산자가 될 수 없는 표현식이라고 생각하시는 게 조금 더 정확하겠습니다.

ㅇ의 이미지

도움이 되었습니다..

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.