Nel codice seguente:Ordine di C - foo() + bar() - deve essere chiamato prima della barra?
int foo();
int bar();
int i;
i = foo() + bar();
E 'garantito dallo standard C che foo
viene chiamato prima bar
si chiama?
Nel codice seguente:Ordine di C - foo() + bar() - deve essere chiamato prima della barra?
int foo();
int bar();
int i;
i = foo() + bar();
E 'garantito dallo standard C che foo
viene chiamato prima bar
si chiama?
No, non esiste un punto di sequenza con +
. C'è in realtà una citazione sulla pagina di Wikipedia che risponde alla tua domanda:
Considera due funzioni f() e g(). In C e C++, l'operatore + non è associato a un punto di sequenza, e quindi nell'espressione f() + g() è possibile che sia prima che f() o g() vengano eseguiti.
No, non lo è. L'ordine di valutazione degli argomenti della funzione e dell'operatore non è definito.
Lo standard dice solo che le chiamate a foo
e bar
non possono essere intercalate, cosa che può succedere quando si valutano sottoespressioni senza chiamate di funzione.
No, questo non è definito. Da K & R Pagina 200:
l'ordine di valutazione delle espressioni è, con alcune eccezioni, non definito, anche se le sottoespressioni comportano effetti collaterali. Cioè, a meno che la definizione dell'operatore garantisca che i suoi operandi siano valutati in un particolare ordine, l'implementazione è libera di valutare gli operandi in qualsiasi ordine, o addirittura di interlacciare la loro valutazione.
Pagina 205 di K & R descrive gli operatori additivi, e non definisce l'ordine di valutatore dei due operandi.
E 'specificato, e nel caso della C99 la citazione in questione è di 6,5/3:
Ad eccezione di quanto speci fi cato in seguito (per la funzione-chiamata
()
,&&
,||
,?:
, e operatori virgola) , l'ordine di valutazione delle sottoespressioni e l'ordine in cui gli effetti collaterali si verificano sono entrambi non precisati.
Nel tuo esempio, foo()
e bar()
sono sottoespressioni della piena espressione i = foo() + bar()
.
Il "dopo" per le chiamate funzione non è direttamente rilevante qui, ma per riferimento spetta 6.5.2.2/10:
l'ordine di valutazione della funzione designatore, l'attuale argomenti, e le sottoespressioni all'interno degli argomenti effettivi sono non specificate , ma c'è un punto di sequenza prima della chiamata effettiva.
Per &&
E '6.5.13/4:
differenza del bit a bit & operatore binario, i & & operatore garanzie sinistra a destra valutazione; c'è un punto di sequenza dopo la valutazione del primo operando.
Dal +
non è nella lista degli operatori in alto, &&
e +
sono "a differenza" nello stesso modo in cui &&
e &
sono "a differenza", e questo è proprio la cosa che stai chiedendo . A differenza di &&
, +
, non garantisce la valutazione da sinistra a destra.
La risposta corretta in cui lavoro è "Se l'ordine è importante, il codice non è mantenibile indipendentemente da ciò che lo standard dice che accadrà". Se devi avere foo() valutato prima di bar(), valuta esplicitamente foo() prima di bar(). La base per questo non è che ogni programmatore conosce gli standard, e quelli che non sanno se l'autore originale ha fatto.
Dove c'è un argomento di funzione nel suo codice? – Pubby
@Pubby funzione sostitutiva con operatore qui. –