Sono i cosiddetti operatori bitwise e short-circuit.
Premesso che quelli singoli NON si dovrebbero usare al posto dei doppi, vediamo il perchè.
Gli operatori singoli operano sui bit: sono operatori che servono a fare "calcoli" tra bit, non sono operatori logici. Il risultato può sembrare uguale, ma non lo è, per un semplice motivo.
Gli operatori doppi offrono il short-circuit evaluation, mentre gli altri no. Cosa comporta? Vediamo un esempio:
Questo codice effettua per prima cosa una verifica sulla condizione "test". Se questa risulta falsa, il resto dell'espressione non viene valutato, quindi non viene preso in considerazione poichè sarebbe "inutile": FALSE messo in AND con qualunque altra cosa darà sempre FALSE. Il risultato dell'espressione è già noto, non serve verificare altro.codice:boolean test = false; if (test && fireTheWorld()) { // The world is on fire }
Nell'esempio, quindi, dato che la variabile booleana "test" è false, non viene eseguito il metodo "fireTheWorld()", non si entra nel corpo dell'isruzione if e si passa oltre.
Questo esempio:
è decisamente diverso: viene valutata prima la condizione "test" e successivamente, qualunque sia il risultato della valutazione, viene valutato anche fireTheWorld(). Con la conseguenza che, sebbene il risultato dell'espressione totale sia comunque FALSE, il metodo "fireTheWorld()" viene comunque invocato... ed il mondo va a fuoco nonostante le nostre buone intenzioni. Non si entra, comunque, nel corpo dell'if, ma il metodo viene invocato.codice:boolean test = false; if (test & fireTheWorld()) { // The world is on fire }
Un esempio più numerico:
La prima if è corretta: essendo che b è uguale a 0, la seconda parte (che effettua una divisione) non viene valutata, quindi non viene eseguita.codice:int a = 9; int b = 0; if ((b != 0) && (a / b > 1)) { // <<-- corretto! // a e b non sono uguali } if ((b != 0) & (a / b > 1)) { // <<-- sbagliato! // a e b non sono uguali }
La seconda if è sbagliata: viene verificato che b è uguale a zero, ma ciò nonostante, la divisione successiva viene eseguita, sollevando un bell'errore di divisione per zero.
La stessa cosa si applica all'operatore ||
Ciao.![]()




Rispondi quotando