È `X-> 0 && array [x]` comportamento ben definito in C ++?
-
27-09-2019 - |
Domanda
Posso usare x
su entrambi i lati di un'espressione booleana quando post-incremento sul lato sinistro?
La linea in questione è:
if(x-- > 0 && array[x]) { /* … use x … */ }
è quello definito attraverso lo standard? Sarà array [x] utilizzare il nuovo valore della x
o di quello vecchio?
Soluzione
Dipende.
Se &&
è il solito operatore logico cortocircuito, allora va bene perché c'è un punto sequenza. array[x]
utilizzerà il nuovo valore.
Se &&
è un utente (o libreria) definito operatore sovraccaricato, allora non c'è corto-circuito, e anche nessuna garanzia di un punto di sequenza tra la valutazione della x--
e la valutazione di array[x]
. Questo sembra improbabile dato il codice, ma senza contesto non è possibile dire con certezza. Penso che sia possibile, con un'attenta definizione di array
, di organizzare in questo modo.
Questo è il motivo per cui è quasi sempre una cattiva idea di sovraccarico operator&&
.
A proposito, if ((x > 0) && array[--x])
ha un effetto molto simile (ancora una volta, supponendo che non l'overloading degli operatori imbrogli), e, a mio parere è più chiaro. La differenza è se o non x
viene decrementato passato 0, che si può o non può essere affidamento su.
Altri suggerimenti
Si, è ben definito. &&
introduce un punto di sequenza.