Les opérateurs au niveau du bit sont censés parcourir les variables et les utiliser bit à bit. Dans le cas d'entiers, de longs, de caractères, cela a du sens. Ces variables peuvent contenir la plage complète des valeurs imposées par leur taille.
Dans le cas des booléens, cependant, un booléen ne peut contenir que deux valeurs. 1 = vrai ou 0 = faux. Mais la taille du booléen n'est pas définie. Il peut être aussi grand qu'un octet ou aussi petit.
Quel est donc l'effet de l'utilisation d'un opérateur au niveau du bit sur un booléen? La JVM la traduit-elle essentiellement en un opérateur logique normal et continue-t-elle? Traite-t-il le booléen comme une entité à bit unique aux fins de l'opération? Ou le résultat n'est-il pas défini avec la taille d'un booléen?
Les opérateurs &, ^ et | sont des opérateurs au niveau du bit lorsque les opérandes sont des types intégraux primitifs. Ce sont des opérateurs logiques lorsque les opérandes sont booléens, et leur comportement dans ce dernier cas est spécifié. Voir la section 15.22.2 de la Java Language Specification pour plus de détails.
L'utilisation de l'opérateur au niveau du bit peut contourner le comportement de court-circuit:
boolean b = booleanExpression1() && booleanExpression2();
boolean b = booleanExpression1() & booleanExpression2();
Si booleanExpression1()
est évaluée à false
, alorsbooleanExpression2()
n'est pas évalué dans le premier cas, etbooleanExpression2()
(et quels que soient les effets secondaires qu'elle puisse avoir) est évalué dans le deuxième cas,
Au-delà de ce qui est couvert dans les autres réponses, il convient de noter que &&
Et ||
Ont une priorité différente de &
Et |
.
Extrait de le tableau de priorité (avec la priorité la plus élevée en haut).
bitwise AND &
bitwise exclusive OR ^
bitwise inclusive OR |
logical AND &&
logical OR ||
Qu'est-ce que cela signifie pour vous?
Absolument rien, tant que vous vous en tenez à seulement &
Et |
Ou seulement &&
Et ||
.
Mais, puisque |
A une priorité plus élevée que &&
(Par opposition à ||
, Qui a une priorité plus faible), les mélanger librement pourrait entraîner un comportement inattendu.
Donc a && b | c && d
Est identique à a && (b | c) && d
,
par opposition à a && b || c && d
qui serait (a && b) || (c && d)
.
Pour prouver qu'ils ne sont pas les mêmes, considérez un extrait de la table de vérité:
a | b | c | d | (b|c) | (a&&b) | (c&&d) | a && (b|c) && d | (a&&b) || (c&&d)
F | T | T | T | T | F | T | F | T
^ ^
|- not the same -|
Si vous voulez que OR ait une priorité plus élevée que AND, vous pourriez utilisez |
Et &&
Ensemble, mais c'est non recommandé.
Mais vous devriez vraiment les mettre entre crochets pour clarifier la priorité chaque fois que vous utilisez des symboles différents, c'est-à-dire (a && b) || c
(Crochets pour clarifier la priorité), a && b && c
(Pas de crochets nécessaires).
Même si cela fonctionne, vous ne devriez pas le faire. Les spécifications de langage définissent les opérateurs au niveau du bit uniquement lorsque les deux opérandes sont de type entier primitif ou les deux sont de type booléen. Je dirais que pour tout autre cas, les résultats ne sont pas définis:
http://Java.Sun.com/docs/books/jls/second_edition/html/expressions.doc.html#5228