Po pierwsze, pewne tło: jestem nauczycielem informatyki i staram się wprowadzić operatorów logicznych języka java do mojej klasy 10. Mój nauczyciel-mentor przejrzał przygotowany przeze mnie arkusz roboczy i skomentował, że mogę pozwolić im użyć tylko jednego & lub | oznaczać operatorów, ponieważ „robią to samo”.
Zdaję sobie sprawę z różnicy między & i &&.
& jest operatorem bitowym przeznaczonym do stosowania między liczbami całkowitymi, do wykonywania „kruszenia bitów”.
&& to operator warunkowy przeznaczony do użycia między wartościami logicznymi.
Aby udowodnić, że operatorzy ci nie zawsze „robią to samo”, postanowiłem znaleźć przykład, w którym użycie bitowej między wartościami logicznymi doprowadziłoby do błędu. Znalazłem ten przykład
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);
Ten przykład pokazuje, że jeśli wartość musi zostać zmieniona przez drugą połowę wyrażenia, doprowadziłoby to do różnicy między wynikami, ponieważ bitowy jest chętnym operatorem, podczas gdy warunek zachowuje się jak zwarcie (nie ocenia drugiej połowa, jeśli pierwsza połowa jest fałszywa w przypadku && i prawdziwa w przypadku ||).
Mam problem z tym przykładem. Dlaczego chcesz zmienić wartość w tym samym czasie, gdy porównujesz ją? Nie wydaje się to dobrym sposobem na kodowanie. Zawsze byłem niechętny wykonywaniu wielu operacji w jednym wierszu w moim kodzie produkcyjnym. Wygląda na to, że zrobiłby to „kodujący kowboj” bez sumienia co do możliwości utrzymania jego kodu. Wiem, że w niektórych domenach kod musi być tak zwarty, jak to możliwe, ale z pewnością jest to ogólnie słaba praktyka?
Mogę wyjaśnić mój wybór zachęcania do korzystania z && i || ponad i | ponieważ jest to przyjęta konwencja kodowania w inżynierii oprogramowania .
Ale czy ktoś mógłby mi podać lepszy, nawet rzeczywisty przykład użycia operatora bitowego w wyrażeniu warunkowym?