По-перше, деякий досвід: я навчаюсь ІТ-викладачам і намагаюся познайомити бульних операторів 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);
Цей приклад показує, що якщо значення має бути змінено на другу половину виразу, це призведе до різниці між результатами, оскільки побітовий режим є прагнутим оператором, тоді як умовне поводиться як коротке замикання (не оцінює друге половина, якщо перша половина помилкова у випадку && та справжня у випадку ||).
У мене є проблема з цим прикладом. Чому ви хочете змінити значення одночасно з порівнянням на ньому? Це не здається надійним способом кодування. Я завжди був проти того, щоб робити кілька операцій в одному рядку в своєму виробничому коді. Здається, щось таке "кодує ковбой", не маючи сумління щодо ремонтопридатності свого коду. Я знаю, що в деяких областях код повинен бути максимально компактним, але, звичайно, це погана практика взагалі?
Я можу пояснити свій вибір заохочення до використання && та || над & і | тому що це прийнята норма кодування в інженерії програмного забезпечення .
Але чи міг би хтось надати мені кращий, навіть реальний, приклад використання побітового оператора в умовному виразі?