Perchè gli operatori logici usano la cosiddetta short-circuit logic mentre gli operatori bitwise no.
L'espressione viene sempre valutata da sinistra verso destra. Se si usano gli operatori logici, la valutazione si ferma non appena il risultato può già essere calcolato. In una AND, ad esempio, se il primo operando è FALSO non ha nessun senso andare a valutare gli altri operandi, in quanto il risultato è già noto a priori: sarà FALSO.
In una OR, se il primo operando è TRUE, non ha nessun senso andare a valutare gli altri, perchè il risultato è sicuramente TRUE.
Se, al contrario, i primi operandi non sono sufficienti già a determinare il risultato finale, i rimanenti operandi verranno valutati man mano (procedendo sempre da sinistra verso destra) fino a quando il risultato non sarà certo o fino alla fine degli operandi.
Esempio per capire meglio:
codice:
if (metodo1() && metodo2() && metodo3()) {
...
}
Se metodo1() restituisce FALSE, l'esecuzione termina perchè il risultato dell'intera espressione può già essere calcolato: sarà FALSE. metodo2() e metodo3() non verranno eseguiti.
Se metodo1() restituisce TRUE, non è possibile a priori sapere il risultato dell'espressione... quindi si procederà e verrà eseguito metodo2(). Se metodo2() restituisce FALSE il risultato è già determinato e metodo3() non verrà eseguito. Altrimenti verrà eseguito anche metodo3() e il risultato dipenderà solo da lui.
Questa è la short-circuit logic.
Questa logica non viene applicata con gli operatori bitwise per i quali tutti gli operandi vengono sempre valutati.
Di conseguenza, alla riga
codice:
bool = (bool2 && method1("2")); //2
Il risultato dell'espressione in AND può già essere valutato considerando il primo operando "bool2" che vale false... method1() non verrà eseguito.
Ciao.