In primo luogo, alcuni retroscena: sono un insegnante in formazione IT e sto cercando di introdurre gli operatori booleani di Java alla mia classe di 10 ° grado. Il mio insegnante-mentore ha esaminato un foglio di lavoro che ho preparato e ha commentato che potevo lasciarli usare solo un singolo & o | per indicare gli operatori, perché "fanno la stessa cosa".
Sono consapevole della differenza tra & e &&.
& è un operatore bit a bit destinato all'uso tra numeri interi, per eseguire "bit-twiddling".
&& è un operatore condizionale destinato all'uso tra valori booleani.
Per dimostrare che questi operatori non sempre "fanno la stessa cosa", ho deciso di trovare un esempio in cui l'uso del bitwise tra valori booleani comporterebbe un errore. Ho trovato questo esempio
boolean bitwise;
boolean conditional;
int i=10, j=12;
bitwise = (i<j) | ((i=3) > 5); // value of i after oper: 3
System.out.println(bitwise+ " "+ i);
i=10;
conditional = (i<j) || (i=3) > 5 ; // value of i after oper: 10
System.out.println(conditional+ " "+ i);
i=10;
bitwise = (i>j) & (i=3) > 5; // value of i after oper: 3
System.out.println(bitwise+ " "+ i);
i=10;
conditional = (i>j) && (i=3) > 5; // value of i after oper: 10
System.out.println(conditional+ " "+ i);
Questo esempio mostra che se un valore deve essere modificato dalla seconda metà dell'espressione, ciò porterebbe a una differenza tra i risultati, poiché bit a bit è un operatore desideroso, mentre il condizionale si comporta come un cortocircuito (non valuta la seconda metà, se la prima metà è falsa nel caso di && e vera nel caso di ||).
Ho un problema con questo esempio. Perché dovresti cambiare un valore contemporaneamente a un confronto su di esso? Non sembra un modo robusto per codificare. Sono sempre stato contrario a fare più operazioni in una sola riga nel mio codice di produzione. Sembra qualcosa che farebbe un "cowboy in codice" senza coscienza per quanto riguarda la manutenibilità del suo codice. So che in alcuni domini il codice deve essere il più compatto possibile, ma sicuramente questa è una cattiva pratica in generale?
Posso spiegare la mia scelta di incoraggiare l'uso di && e || oltre & e | perché questa è una convenzione di codifica accettata nell'ingegneria del software .
Ma qualcuno potrebbe darmi un esempio migliore, persino reale, dell'uso di un operatore bit per bit in un'espressione condizionale?