2012-07-09 3 views
6

저는 함수 반환 값을 처리하기 위해 함수 바로 뒤에 단 하나의 '&'연산자를 적용하려고했습니다. 그러나, 나는 (내가는 MinGW에서 GCC를 사용) 컴파일 타임 오류가 발생단항 및 연산자를 사용하여 반환 값

test.c: In function 'main':

test.c:8:12: error: lvalue required as unary '&' operand

내가 쉽게 내 질문에 이해할 수 있도록하는 코드를 만들어 :

int function(); 
void function2(int *param); 

main() 
{ 
    function2(&function1()); 
} 

int function1() 
{ 
    return 10; 
} 

void function2(int *param) 
{ 
    return; 
} 

이 코드를 같은 컴파일 타임 오류를 생성 .

질문 : 다른 코드없이 다른 곳에서 function2 "()"의 '&'연산자를 어떻게 사용할 수 있습니까?

+2

'function1'이'int'를 리턴하는 한 당신은 할 수 없습니다. – AnT

답변

11

는 C99과 이후를 통해 달성 될 수있다 :

function2((int[]){function1()}); 

즉 문자 그대로의 화합물을 만드는 함수 반환 값을 포함.

+0

이것은 실제로 매우 영리합니다! 기본적으로 임시 "익명"변수를 만들어 function1의 반환 값으로 초기화합니다. – eresonance

10

수 없습니다. 함수의 반환 값은 값이지만 객체는 아닙니다. 메모리에 지정된 위치가없고 주소가 없으므로 포인터를 사용할 수 없습니다. 대신 당신은 쓸 수 :

int a = function1(); 
function2(&a); 
3

문제는 & 변수의 주소를 취한다는 것입니다. 함수의 반환 값은 반드시 메모리에 저장되는 것은 아닙니다. 즉, lvalue이 아닙니다 (=의 왼쪽에 입력 할 수 없습니다). 따라서 주소가 없기 때문에 주소를 요청하는 것은 의미가 없습니다.

int result = function1(); 
function2(&result); 

C11 표준으로 6.3.2.1에 lvalue를 정의 : 같은 표준에서

An lvalue is an expression (with an object type other than void) that potentially designates an object; (footnote: The name ‘‘lvalue’’ comes originally from the assignment expression E1 = E2, in which the left operand E1 is required to be a (modifiable) lvalue. It is perhaps better considered as representing an object ‘‘locator value’’. What is sometimes called ‘‘rvalue’’ is in this International Standard described as the ‘‘value of an expression’’)

, 그것이 말하는 6.5.3.2에서 :

당신이해야 할 것은 다음과 같다

The operand of the unary & operator shall be either a function designator, the result of a [] or unary * operator, or an lvalue that designates an object that is not a bit-field and is not declared with the register storage-class specifier.

+0

"함수의 반환 값이 반드시 변수에 저장되어있는 것은 아닙니다"라는 말은 올바르지 않습니다. 특히 "반드시 필요하지는 않습니다". 리턴 값이 저장 될 변수를 지정하지 않으면 저장되지 않습니다. –

+0

@nathanwhite, 당신 말이 맞아요. 나는 이것을 "기억"으로 바꿨다. – Shahbaz

2

함수에서 반환 한 값의 주소를 가져올 수 없습니다.

그 값이 CPU 레지스터를 통해 호출자에게 다시 전달되면 어떻게 될까요?

function2()를 function1()의 결과로 사용하는 유일한 방법은 메모리에 주소가있는 중간 변수를 사용하는 것입니다.

main() 
{ 
    int a; 

    a = function1(); 
    function2(&a); 
} 
1

직접 할 수 없습니다. 함수 반환 값은 스택에 저장 될 수 있으며 (곧 다른 함수 호출에서 덮어 쓰게 될 것입니다.) 또는 레지스터 등에서 호출 규칙에 따라 달라질 수 있습니다.

아마도 그 장소에 직접 액세스하고 싶지는 않을 것입니다. 실제로는 자신이하는 일을 실제로 알지 않는 한별로 이해가되지 않을 수도 있습니다.

작업하는 함수의 반환 값은 rvalue (음 ... 단순히 값)이고 '&'연산자는 컴파일러 출력에서 ​​알 수 있듯이 lvalue (사용자가 지정할 수있는 대상 에). Ergo, 반환 값을 변수 (main()의 내부 변수)에 저장 한 다음 주소를 가져옵니다.당신이 원하는 무엇

int main() { 
    int x = function1(); 
    function2(&x); 
}