Tout d'abord, quelques antécédents: je suis professeur d'informatique en formation et j'essaie de présenter les opérateurs booléens de java à ma classe de 10e année. Mon enseignant-mentor a examiné une feuille de travail que j'avais préparée et a fait remarquer que je pouvais les laisser utiliser un seul & ou | pour désigner les opérateurs, car ils "font la même chose".
Je suis conscient de la différence entre & et &&.
& est un opérateur au niveau du bit destiné à être utilisé entre des entiers, pour effectuer un "twiddling de bits".
&& est un opérateur conditionnel destiné à être utilisé entre des valeurs booléennes.
Pour prouver que ces opérateurs ne "font pas toujours la même chose", j'ai cherché un exemple où l'utilisation du bit entre les valeurs booléennes conduirait à une erreur. J'ai trouvé cet exemple
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);
Cet exemple montre que si une valeur doit être modifiée par la seconde moitié de l'expression, cela entraînerait une différence entre les résultats, car bitwise est un opérateur impatient, tandis que le conditionnel se comporte comme un court-circuit (n'évalue pas la seconde moitié, si la première moitié est fausse dans le cas de && et vraie dans le cas de ||).
J'ai un problème avec cet exemple. Pourquoi voudriez-vous changer une valeur en même temps que vous faites une comparaison dessus? Cela ne semble pas être un moyen robuste de coder. J'ai toujours été opposé à faire plusieurs opérations sur une seule ligne dans mon code de production. Cela ressemble à quelque chose que ferait un "cowboy codeur" sans conscience quant à la maintenabilité de son code. Je sais que dans certains domaines, le code doit être aussi compact que possible, mais c'est certainement une mauvaise pratique en général?
Je peux expliquer mon choix d'encourager l'utilisation de && et || sur & et | car il s'agit d' une convention de codage acceptée en génie logiciel .
Mais quelqu'un pourrait-il me donner un meilleur exemple, même réel, d'utilisation d'un opérateur au niveau du bit dans une expression conditionnelle?