2013-08-29 24 views
7

Questa è un'altra questione sequenza di punti, ma piuttosto semplice:Punto di sequenza dalla chiamata di funzione?

#include <stdio.h> 
void f(int p, int) { 
    printf("p: %d\n", p); 
} 

int g(int* p) { 
    *p = 42; 
    return 0; 
} 

int main() { 
    int p = 0; 
    f(p, g(&p)); 
    return 0; 
} 

È questo il comportamento indefinito? O la chiamata a g(&p) funge da punto di sequenza?

risposta

9

No. Non viene richiamato il comportamento non definito. È solo non specificato, in quanto l'ordine in cui vengono valutati gli argomenti della funzione non è specificato nello Standard. Quindi l'output potrebbe essere 0 o 42 a seconda dell'ordine di valutazione deciso dal compilatore.

+6

La domanda chiede anche se 'g (& p)' funge da punto di sequenza. Ci sono due punti di sequenza nella valutazione di 'g (& p)': Tra la valutazione di 'g' e la valutazione di' & p', e tra la valutazione delle "espressioni complete" '* p = 42;' e il '0' nel' ritorno'. Ma nessuno dei due ordina la valutazione dell'argomento 'p' rispetto alla valutazione di' g (& p) '. –

+0

@EricPostpischil: ottimo commento. :-) – Nawaz

4

Il comportamento del programma è specificato dal momento che non sappiamo l'ordine di valutazione degli argomenti della funzione, dalla draft C++ standard1.9programma di esecuzione del paragrafo 3:

alcuni altri aspetti e le operazioni della Le macchine astratte sono descritte in questo standard internazionale come non specificato (ad esempio, l'ordine di valutazione degli argomenti di una funzione). Ove possibile, questo standard internazionale definisce un insieme di comportamenti consentiti. [...]

e tutti gli effetti collaterali dagli argomenti sono in sequenza prima che la funzione viene inserito, dalla sezione 5.2.2funzione chiamata paragrafo 8:

[Nota: Le valutazioni del postfix l'espressione e le espressioni di argomento sono tutte non correlate l'una rispetto all'altra. Tutti gli effetti collaterali delle valutazioni delle espressioni degli argomenti vengono sequenziati prima che la funzione venga immessa (vedere 1.9). Nota -end]

Per quanto riguarda C entrambi i punti sono coperti nel C99 draft standard nella sezione 6.5.2.2 chiama Funzione paragrafo 10:

L'ordine di valutazione della funzione designatore, gli argomenti attuali, e Le sottoespressioni all'interno degli argomenti effettivi non sono specificate, ma c'è un punto di sequenza prima della chiamata effettiva.

Così sia C e C++ si può finire con uno o f(0,0)f(42,0).

Problemi correlati