-
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여야 한다. 왜냐하면 영속적인 객체의 주소를 가지는것으 ㄴ괜찮지만, 임시적인 객체의 주소를 가지는것은
굉장히 위험하기 때문이다.
'@ 16. 1 ~ 17. 1 > 면접관련' 카테고리의 다른 글
STL 컨테이너 정리 (0) 2017.01.04 C++ 캐스팅 종류 (0) 2017.01.04 부모클래스의 메서드가 오버로딩된 메서드인 경우 (0) 2017.01.04 생성자 및 대입연산자 관련 자식에서 부모를 호출해야한다. (0) 2017.01.04 클래스 생성 순서(부모, 자식) (0) 2017.01.04