Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    Metodi negli operatori logici

    Salve, mi sono imbattuto in questo codice che mi ha fatto sorgere qualche dubbio...
    codice:
    public class TestClass {
    	public static void main(String args[ ]) {
    		int i = 0;
    		boolean bool1 = true;
    		boolean bool2 = false;
    		boolean bool  = false;
    		bool = (bool2 &  method1("1")); //1
    		bool = (bool2 && method1("2")); //2
    		bool = (bool1 |  method1("3")); //3
    		bool = (bool1 || method1("4")); //4
    	}
    	public static boolean method1(String str) {
    		System.out.println(str);
    		return true;
    	}
    }
    Eseguendolo stampa 1 e 3...
    method1() restituisce sempre true, mentre bool vale, in sequenza, false false true true: non c'è quindi corrispondenza tra l'esito del confronto logico e l'esecuzione di method1().

    Come mai l'operatore bitwise (& e |) fa stampare sempre e quello logico (&& e ||) mai?

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    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.
    Ultima modifica di LeleFT; 29-08-2017 a 18:31
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da Gas75 Visualizza il messaggio
    Come mai l'operatore bitwise (& e |) fa stampare sempre e quello logico (&& e ||) mai?
    Gli operatori && e || hanno un comportamento che viene detto di "short-circuit". Ovvero il secondo operando NON lo valutano nemmeno (se fosse la invocazione di un metodo non avviene) SE già dal primo operando è possibile dedurre il risultato finale.

    Se in una "or" il primo operando è true, allora NON c'è bisogno di valutare il secondo operando, in quanto il risultato è sicuramente true.
    Se in una "and" il primo operando è false, allora NON c'è bisogno di valutare il secondo operando, in quanto il risultato è sicuramente false.

    Gli operatori & e | invece NON hanno il comportamento short-circuit e quindi valutano SEMPRE entrambi gli operandi prima di poter dare il risultato.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  4. #4
    Grazie per la rapida risposta.
    Ok sulla logica short-circuit, ma siccome bool1 è true, perché non stampa anche il 4 e non si ferma a bool1 nella riga // 3?
    Ultima modifica di Gas75; 29-08-2017 a 18:31

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da Gas75 Visualizza il messaggio
    ma siccome bool1 è true, perché non stampa anche il 4?
    boolean bool1 = true;
    bool = (bool1 || method1("4")); //4

    Perché appunto c'è || ovvero il primo operando è true, quindi il secondo non viene valutato.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  6. #6
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Perché appunto c'è || ovvero il primo operando è true, quindi il secondo non viene valutato.
    Ok!!!

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.