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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top