Во-первых, немного предыстории: я учитель-информатик, и я пытаюсь представить булевы операторы Java в своем классе 10-го класса. Мой учитель-наставник просмотрел рабочий лист, который я подготовил, и прокомментировал, что я могу позволить им использовать только один & или | обозначать операторов, потому что они «делают то же самое».
Я осознаю разницу между & и &&.
& является побитовым оператором, предназначенным для использования между целыми числами, для выполнения "сдвоенного бита".
&& - это условный оператор, предназначенный для использования между логическими значениями.
Чтобы доказать, что эти операторы не всегда «делают одно и то же», я решил найти пример, где использование побитового значения между логическими значениями приведет к ошибке. Я нашел этот пример
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);
Этот пример показывает, что, если значение должно быть изменено второй половиной выражения, это приведет к разнице между результатами, поскольку побитовый оператор является нетерпеливым, а условное поведение ведет себя как короткое замыкание (не оценивает вторую половина, если первая половина ложна в случае && и истина в случае ||).
У меня есть проблема с этим примером. Почему вы хотите изменить значение в то же время, когда вы сравниваете его? Это не похоже на надежный способ кодирования. Я всегда был против выполнения нескольких операций в одной строке моего производственного кода. Похоже, что «ковбой-программист», не имеющий совести в отношении возможности сопровождения своего кода, подойдет. Я знаю, что в некоторых областях код должен быть максимально компактным, но, конечно, это плохая практика в целом?
Я могу объяснить свой выбор поощрения использования && и || над & и | потому что это общепринятая кодировка в программной инженерии .
Но может ли кто-нибудь дать мне лучший, даже реальный, пример использования побитового оператора в условном выражении?