2012-07-09 16 views
6

Ho voluto applicare l'operatore unario '&' dietro la funzione per operare sul valore di ritorno della funzione. Tuttavia, ottengo un errore di compilazione (io uso gcc da MinGW)utilizzando unario e operatore su valore restituito funzione

test.c: In function 'main':

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

ho fatto un codice per rendere la mia domanda più facile da capire:

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

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

int function1() 
{ 
    return 10; 
} 

void function2(int *param) 
{ 
    return; 
} 

Questo codice crea lo stesso errore di compilazione .

La domanda è: Come posso utilizzare l'operatore '&' solo da function2 "()", senza altro codice altrove?

+2

Non è possibile, fintanto che 'function1' restituisce un' int'. – AnT

risposta

11

Ciò che si vuole può essere realizzato in C99 e poi via:

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

vale a dire produzione di un composto letterale che contiene il valore di ritorno della funzione.

+0

Questo è in realtà abbastanza intelligente! In pratica crea una variabile "anonima" temporanea e la inizializza al valore di ritorno di function1. – eresonance

10

Non è possibile. Il valore di ritorno di una funzione è un valore ma non un oggetto. Non ha una posizione designata in memoria, nessun indirizzo, e quindi non si può puntare ad esso. Invece si potrebbe scrivere:

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

Il problema è che & prende l'indirizzo delle variabili. Il valore di ritorno di una funzione non è necessariamente memorizzato. In altre parole, non è un lvalue (non è possibile inserirlo sul lato sinistro di =). Pertanto, non ha senso chiedere il suo indirizzo (perché non esiste).

cosa si dovrebbe fare è la seguente:

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

Lo standard C11 definisce lvalue in 6.3.2.1 come:

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’’)

Nello stesso standard, in 6.5.3.2 si dice:

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

Indicare "Il valore di ritorno di una funzione non è necessariamente memorizzato in una variabile" non è corretto, nello specifico "non è necessariamente". A meno che non si specifica una variabile per il valore restituito da memorizzare, NON è memorizzata. –

+0

@nathanwhite, hai ragione. L'ho cambiato in "memoria". – Shahbaz

2

Non è possibile ottenere l'indirizzo di un valore restituito da una funzione.

Cosa succede se tale valore viene passato al chiamante tramite un registro CPU?

L'unico modo per rendere function2() utilizzare il risultato di function1() è utilizzare una variabile intermedia, che ha un indirizzo in memoria.

main() 
{ 
    int a; 

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

Non puoi farlo direttamente. Il valore di ritorno della funzione può essere memorizzato nello stack (e verrà presto sovrascritto in un'altra chiamata di funzione), o forse nei registri ecc. (A seconda della convenzione di chiamata).

Probabilmente non si vuole accedere direttamente a nessuno di quei posti e non ha molto senso (beh, forse a meno che tu non sappia cosa stai facendo).

Il valore di ritorno di una funzione con cui si lavora è un valore rvalue (beh ... semplicemente un valore), mentre l'operatore '&' necessita, come si è visto nell'output del compilatore, di un valore (qualcosa che è possibile assegnare a). Ergo, basta memorizzare il valore di ritorno in una variabile (una variabile locale all'interno del tuo 'main()', quindi ottenere l'indirizzo di esso).

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