2012-04-27 11 views

risposta

12

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.

http://en.wikipedia.org/wiki/Sequence_points

2

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.

+2

Dove c'è un argomento di funzione nel suo codice? – Pubby

+0

@Pubby funzione sostitutiva con operatore qui. –

0

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.

7

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.

0

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.

Problemi correlati