ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • L벨류 R벨류 정리
    @ 16. 1 ~ 17. 1/면접관련 2017. 1. 4. 21:35

    흔히 L벨류는 대입 연산자 왼쪽에 있는 값, R벨류는 대입 연산자 오른쪽에 있는 값이라고 하는데..

    C에서의 개념이도


    C++넘어와서는 조금 달라진다.


    L벨류로 선언된 객체는 단일 표현식을 넘어 서서도 존재하게 된다. 예를 들어 OBJ, *PTR, PTR[INDEX], ++X들은 L벨류이다.

    R벨류는 임시적으로 표현식이 끝나면 없어지는 값들이다.

    예를들어 X + Y, 1729(단순 숫자다), X++ 들이 R벨류라는데..


    근데 위에 전위연산자 후위연산자가 왜 틀린 벨류일까?

    int x = 0으로 선언된 x가 있으면 x는 L벨류이고 영속성있는 객체이다.

    ++x : 값을 증가 시키고 영속성있는 객체로 이름을 붙이기 때문이다. 

    하지만 x++는 R벨류이다.  왜냐면 영속성있는 객체의 원래값을 복사하고 영속성 있는 개체의 값을 증가 시키고 

    복사된 값을 리턴하는 동작을 하기 때문이다. 여기서 복사된 값은 임시적인 값이다.

    *결론 : ++x와 x++ 둘다 x의 값을 증가시키지만, ++x는 영속성있는 객체 자신을 리턴하지만, x++는 임시적인 복사본을 리턴합니다.

    이것이 ++x가 L벨류 x++가 R벨류인 이유다.


    좀더 직관적으로 본다면..표현식에서 값의 주소를 가지고 있는지를 알아보자. 그럼 L벨류 인지 아닌지 알 수 있습니다.

    만약 값의 주소를 알 수 있다면 그 값은 L벨류 입니다.

    예를들어 &obj, &*ptr, &ptr[index], &++x같은 표현식은 문법적으로 유효하다. 

    하지만 &1729, &(x + y) &x++ 같은 표현식은 유효하지 않다. 

    왜그럴까?

    주소 연산자에서 피연산자는 lvalue여야 한다. 왜냐하면 영속적인 객체의 주소를 가지는것으 ㄴ괜찮지만, 임시적인 객체의 주소를 가지는것은

    굉장히 위험하기 때문이다.




Designed by Tistory.