2010-10-28 16 views
10

Posso usare x su entrambi i lati di un'espressione booleana quando lo post-incremento sul lato sinistro?`` x--> 0 && array [x] `comportamento ben definito in C++?

La linea in questione è:

if(x-- > 0 && array[x]) { /* … use x … */ } 

è quello definito attraverso lo standard? Array [x] utilizzerà il nuovo valore di x o quello precedente?

+6

Ricordarsi di mantenere pulito il proprio codice affinché altri possano leggerlo, anche se è ben definito può introdurre un problema se qualcuno successivamente modifica o aggiunge all'espressione. Solo il mio 2c –

+5

Anche se potrebbe essere ben definito, non dovresti usare questo tipo di codice. Puoi capirlo mentre lo scrivi, ma il prossimo non lo può fare. – codymanix

+0

questo codice non è poi così male dopo tutto. ho visto un codice peggiore nel kernel di Linux: D – knittl

risposta

12

Dipende.

Se && è il solito operatore logico di cortocircuito, allora va bene perché c'è un punto di sequenza. array[x] utilizzerà il nuovo valore.

Se && è un operatore sovraccarico definito dall'utente (o libreria), non vi è alcun cortocircuito né garanzia di un punto di sequenza tra la valutazione di x-- e la valutazione di array[x]. Questo sembra improbabile dato il tuo codice, ma senza contesto non è possibile dirlo con certezza. Penso che sia possibile, con un'attenta definizione di array, organizzarlo in questo modo.

Ecco perché è quasi sempre una cattiva idea sovraccaricare operator&&.

A proposito, if ((x > 0) && array[--x]) ha un effetto molto simile (anche in questo caso, supponendo che nessun operatore sovraccarichi gli imbrogli), e secondo me è più chiaro. La differenza è se x decrementa o meno 0, su cui è possibile o meno fare affidamento.

+0

Da quando è possibile sovraccaricare l'operatore '&&'? – zwol

+0

è l'operatore booleano && e non è sovraccarico – knittl

+0

@Steve: anche se && fosse sovraccarico, sarebbe comunque definito comportamento, no? –

11

Sì, è ben definito. && introduce un punto di sequenza.

+1

Huh, ho la sensazione che voi o altri stiate usando un feed come Twitter per rispondere in modo così veloce. Quando vedo per la prima volta una domanda, in genere ha già risposto ...? –

+0

@Alf P. Steinbach, clicca il link "domande" una volta in un secondo – Harmen

+0

@ Alf: Quando ho visto questa domanda non ha ricevuto risposta e così ho risposto. Il trucco è: aggiorna la pagina "Nuove domande" almeno una volta ogni 10 secondi. ';-)' –

Problemi correlati