2014-09-30 6 views
2

this textbook의 교과서 질문에 답변하고 있습니다.L 값과 C 값의 R 값

저는 C에서 포인터에 대해 배우고 있는데 l 값과 r 값을 발견했습니다. 내 이해에서 :

l-values are values that are defined after they are executed (++x) 
r-values are values that are not defined after they are executed (x++) 

정확합니까?

나는 (내 시도에) 대답하고 싶었 질문 :

a) Which of the following C expressions are L-Values? 
    1. x + 2 Not a L value 
    2. &x Is a L value 
    3. *&x Is a L value 
    4. &x + 2 Not a L value 
    5. *(&x + 2) Is a L value 
    6. &*y Is a L value 

b) Is it possible for a C expression to be a L-value but NOT a R-value? Explain 
    I've read that a L value can be a R value but not vice versa. I can't think of an example of something being an L value but not a R value. 

c) Is &(&z) ever legal in C? Explain 
    Assuming this is not legal since a memory address doesn't have its own memory address? 

내가 닫나요? 감사합니다

+3

를 : C++를 ]? –

+0

BTW C 및 C++의 * 값 범주 *는 거의 동일한 최종 효과를 갖지만 매우 다른 경로를 통해 거기에 도달합니다. 두 가지 모두에 적용되는 설명이 없을 것입니다. 이와 같은 질문은 하나의 언어를 선택해야합니다. –

+0

@BenVoigt : OP가 그가 C에 대해 배우고 있다고 말했기 때문에 C++ 태그를 삭제했습니다. –

답변

7

리터-값은 그들이 (++x) R-값은 그들이

없음 (x++)

실행 된 후 정의되지 않은 값입니다 실행 된 후 정의 된 값이며, 그 정확한 아니다 .

"lvalue"및 "rvalue"라는 단어 (C 표준의 철자법)는 오랜 역사를 가지고 있습니다. 이 용어는 과제의 왼쪽과 오른쪽을 가리키는 "왼쪽"과 "오른쪽"에 대해 "l"에서 온 것입니다.

일부 상황에서, 표현은 어느 는 r- 수치 평가 그 좌변 또는 대해 평가 될 수있다. 이 용어의 정의가 주어지면, "rvalue"는 일반적으로 표현식의 가치라고 생각하는 것입니다. 2+2을 평가하면 4가 산출된다. lvalue에 대한 표현식을 평가한다는 것은 그것이 가리키는 객체를 결정하는 것을 의미했습니다.

int x; 
x = 2 + 2; 

과제의 우측은, 2 + 24을 수득 그 r- 수치 평가 될 것이고, 좌측은 참조 처 오브젝트를 결정하는 수단의 좌변에 대해 평가 될 것이다 : 예를 들어, 주어진 . 표현식의 평가 값은 이 아니며이 아니라 이전에 x에 저장된 값이 사용되지 않습니다.

C 표준은 다르게 정의합니다. C에서 왼쪽 값은 값이 아닙니다. 그것은 일종의 표현입니다. 구체적으로는, 2011 년 ISO C 표준 인용 섹션 6.3.2.1는 :

좌변는 잠재적 객체를 지정하는 (보이드 이외의 오브젝트 유형) 식이고; lvalue가 평가 될 때 개체를 지정하지 않으면 동작이 정의되지 않습니다. . ptr == NULL 다음 *ptr는 현재 사용하지 않는 객체를 지정하지,하지만 여전히 있다면 좌변 당신은 항상 수

는 (단어가 "잠재적"ptr 포인터 객체가 *ptr, 같은 사건을 덮었다 컴파일 타임에 주어진 expression이 lvalue인지 아닌지를 결정한다. C 표준의 이전 버전은 lvalue에 대한 정의에 결함이있다.)

기본적으로 C에서 lvalue은 개체를 지정하는 표현식입니다. 과제의 왼쪽에 표시 될 수있는 표현식이라고 생각할 수 있지만 완전히 정확하지는 않습니다. 예를 들어, const 개체의 이름은 할당의 LHS에있을 수 없지만 여전히 lvalue입니다. (당신이 볼 수 있듯이, 까다로운 일이 될 수 있습니다 좌변 에 대한 정확하고 일관된 정의를 아래로 못 박는.)

어느 x++++x입니다 C.

의 좌변을 C 표준 용어를 사용하지 않습니다 하나의 각주에서 언급 너머를 rvalue : 때때로 "를 rvalue"라는 "식의 값"으로 기술이 국제 표준 에 무엇

. C는 용어를 정의로

그래서, 좌변는 표현의 종류 (C 소스 코드에 존재하는 무엇인가)입니다,하지만 를 rvalue는 동안 존재 일 (식의 계산 결과입니다 프로그램 실행).

(. C++는 glvalues ​​ 등 내가 여기에 들어갈 수 없습니다 등 다양한 규칙 및 좌변과 같은 것들의 여러 가지 다른 종류가 있습니다.)이 [태그를 태그 한 이유

+0

@ T.C .: 좋은 지적; 나는 더 나은 본보기로 바꿨다. –