Primeiro, alguns antecedentes: sou professor de treinamento em TI e estou tentando introduzir os operadores booleanos de java na minha turma da 10ª série. Meu professor-mentor examinou uma planilha que eu preparei e comentei que poderia deixá-los usar apenas uma única & ou | denotar os operadores, porque "fazem a mesma coisa".
Estou ciente da diferença entre & e &&.
& é um operador bit a bit destinado ao uso entre números inteiros, para executar "ajustes de bits".
&& é um operador condicional destinado ao uso entre valores booleanos.
Para provar que esses operadores nem sempre "fazem a mesma coisa", propus-me a encontrar um exemplo em que o uso do bit a bit entre valores booleanos levaria a um erro. Eu encontrei este exemplo
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);
Este exemplo mostra que, se um valor tiver que ser alterado na segunda metade da expressão, isso levaria a uma diferença entre os resultados, já que o bit a bit é um operador ansioso, enquanto o condicional se comporta como um curto-circuito (não avalia o segundo metade, se a primeira metade for falsa no caso de && e verdadeira no caso de ||).
Eu tenho um problema com este exemplo. Por que você deseja alterar um valor ao mesmo tempo em que faz uma comparação? Não parece uma maneira robusta de codificar. Eu sempre fui avesso a fazer várias operações em uma única linha no meu código de produção. Parece algo que um "cowboy de codificação" sem consciência quanto à manutenção de seu código faria. Eu sei que em alguns domínios o código precisa ser o mais compacto possível, mas certamente essa é uma prática ruim em geral?
Eu posso explicar minha escolha de incentivar o uso de && e || sobre & e | porque esta é uma convenção de codificação aceita em engenharia de software .
Mas alguém poderia me dar um exemplo melhor, até do mundo real, do uso de um operador bit a bit em uma expressão condicional?