2013-07-16 1 views
1

다음 코드에서 *a은 rvalue 또는 lvalue입니까?* p는 왼쪽 값 또는 오른쪽 값입니다.

#include <stdio.h> 

void main() 
{ 
    int b=2; 
    int *a=NULL; 
    a=&b; 
    *a=3; 
    printf("%d",*a); 

} 
+2

할당 할 수있는 경우 lvalue입니다. 좀 더 복잡한 것을 묻고 있습니까? –

+0

오른쪽에 있으면 _r_ 값입니다. 네덜란드어로 donkeybridge 전화;) – dmaij

+2

+1 좋은 질문. 그것은 미묘한 점을 가지고있다. 1) 동일한 변수를 지칭하는 동일한 문자는 다른 의미를 갖는다. 2) 일반적인 왼쪽과 오른쪽 규칙은 함수의 인자를 다루지 않습니다. –

답변

1

http://en.wikipedia.org/wiki/Value_%28computer_science%29 노광 같이

Lvalues ​​프로그래밍 실행 프로그램으로 액세스 할 수있는 메모리 어드레스가 (예 : "&"와 같은 일부 주소의 연산자를 통해 C/C++로) 이는 특정 메모리 위치에 대한 참조 또는 참조 해제 된 참조임을 의미합니다. 우변이 lvalues ​​(아래 참조) 또는 비 lvalues ​​

될 수있다 따라서, *는 그것은 좌변이고 r 값의 용어로도 사용될 수있다 좌변

1

이다. 예제를 참조하십시오.

int i, j, *p, *q; 
p = &i; 
q = &j; 

*p = 1; // *p is l-value 
*q = 2; // *q is l-value 

*p = *q // *q is r-value 
그의 주석에 Charles Bailey 의해 지적

-이 문맥에서 사용되는 서브 표현식 *q 여전히 L 값이다 그것은 R 치화에 L 값을 겪는다 여기서 r 값이 필요합니다. *q 여전히 리터 값 왜


이제 하나 를 생각?
r 값의 정의에 따라 이 있으므로 r 값은이를 사용하는 표현식을 초과하여 지속되지 않는 임시 값입니다.
이 경우 *q 값은 *p = *q 수식을 초과하여 유지됩니다.


참고

"*"연산자 - 복종/간접 연산자 - 포인터 변수에 동작하고, 포인터의 주소 값과 동등한 L 값를 반환 .

+1

+1 암시 적 읽기 액세스를 고려해야합니다. –

+1

'* q '는 여전히 lvalue이며, rvalue가 필요한 컨텍스트에서 사용되기 때문에 lvalue-to-rvalue 변환을 거칩니다. –

+0

@CharlesBailey; 그래 네가 맞아. 실제로 나는 r 값으로 l 값을 사용할 수 있다는 것을 보여 주려고했습니다. 가리켜 줘서 고마워. 편집 중이 야. – haccks

관련 문제