Originariamente inviato da LeleFT
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:
codice:
boolean test = false;
if (test && fireTheWorld()) {
// The world is on fire
}
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.
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:
codice:
boolean test = false;
if (test & fireTheWorld()) {
// The world is on fire
}
è 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.
Un esempio più numerico:
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 prima if è corretta: essendo che b è uguale a 0, la seconda parte (che effettua una divisione) non viene valutata, quindi non viene eseguita.
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.