Les opérateurs bit à bit sont censés parcourir les variables et les utiliser petit à petit. Dans le cas des entiers, des longs, des caractères, cela a du sens. Ces variables peuvent contenir la gamme complète de 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 gros qu'un octet ou aussi petit.
Alors, quel est l'effet de l'utilisation d'un opérateur binaire sur un booléen? La JVM le traduit-il essentiellement en opérateur logique normal et passe-t-il à autre chose? Traite-t-il le booléen comme une entité à un seul bit aux fins de l'opération? Ou le résultat est-il indéfini avec la taille d'un booléen?
la source
Réponses:
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 spécification du langage Java pour plus de détails.la source
|=
opérateur était logique, le programme n'aurait jamais dû exécuter lax.getValue()
directive.a || x.foo()
c'est sûr si x est nul, maisa | x.foo()
ne l'est pas.|=
suit les mêmes règles que|
.L'utilisation de l'opérateur au niveau du bit peut contourner le comportement de court-circuit:
Si
booleanExpression1()
évalue àfalse
, alorsbooleanExpression2()
n'est pas évalué dans le premier cas, etbooleanExpression2()
(et quels que soient les effets secondaires qu'il peut avoir) est évalué dans le second cas,la source
&
sera plus rapide, mais l'appel à la deuxième fonction pourrait être ignoré avec l'utilisation de&&
Au-delà de ce qui est couvert dans les autres réponses, il convient de le noter
&&
et d'||
avoir une priorité différente de&
et|
.Extrait de la table de priorité (avec la priorité la plus élevée en haut).
Qu'est-ce que cela signifie pour vous?
Absolument rien, tant que vous vous en tenez uniquement à
&
et|
ou uniquement à&&
et||
.Mais, étant
|
donné que la priorité est plus élevée que&&
(par opposition à||
, qui a une priorité inférieure), les mélanger librement pourrait conduire à un comportement inattendu.C'est donc
a && b | c && d
la même chose quea && (b | c) && d
,par opposition à
a && b || c && d
qui serait(a && b) || (c && d)
.Pour prouver qu'ils ne sont pas identiques, considérez un extrait de la table de vérité:
Si vous voulez que OR ait une priorité plus élevée que AND, vous pouvez utiliser
|
et&&
ensemble, mais ce n'est pas 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
(des crochets pour clarifier la priorité),a && b && c
(pas de crochets nécessaires).la source
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 types entiers primitifs 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
la source