Java boolean |= operator
Récemment, j'ai vu un code à l'aide de ceci:
boolean val = something();
val |= somethingElse();
la partie intéressante est l'opérateur / = (de type binaire) fait sur le type primitif booléen.
cela m'a surpris que |= existe pour booléen, comme si c'était un type entier, et j'ai cherché la spécification Java pour cet opérateur, mais je n'en ai pas trouvé.
je serais curieux si l'opérande de droite est évaluée si la valeur de gauche est déjà vraie.
quelqu'un Peut-il m'indiquer spécifications de Java?
5 réponses
à Partir de la JLS:
15.26.2. Opérateurs De Assignations Composées
Un composé expression d'affectation de la forme
E1 op= E2
est équivalent àE1 = (T) ((E1) op (E2))
, oùT
est le type deE1
sauf queE1
n'est évalué qu'une seule fois.15.22.2. Opérateurs Logiques Booléens
&
,^
et|
Lorsque les deux opérandes d'une
&
,^
, ou|
les opérateurs sont de typeboolean
ouBoolean
, alors le type de l'expression opérateur bitwise estboolean
. Dans tous les cas, les opérandes sont sujettes à la conversion unboxing (§5.1.8) si nécessaire.
|
, la valeur de résultat est false si les deux valeurs d'opérande sont false; sinon, le résultat est true.
Cela signifie que
val |= somethingElse();
est strictement équivalent à
val = val | somethingElse();
(en supposant que somethingElse()
retourne boolean
ou Boolean
).
je serais curieux si l'opérande de droite est évaluée si la valeur de gauche est déjà vraie.
Oui, il serait évaluée, car |
ne court-circuite pas:
15.7.2. Évaluer les opérandes avant L'opération
Le langage de programmation Java garantit que chaque opérande d'un opérateur (sauf les opérateurs conditionnels
&&
,||
et? :
) semble être pleinement évalués avant qu'une partie de l'opération elle-même est effectuée.15.24. Conditionnel Ou De L'Opérateur
||
ainsi,
||
calcule le même résultat que|
boolean
ouBoolean
opérandes. Elle diffère seulement en ce que l'expression de l'opérande de droite est évaluée conditionnellement plutôt que toujours.
http://docs.oracle.com/javase/specs/jls/se5.0/html/expressions.html#15.22.2 pour la définition de |
. Voir http://docs.oracle.com/javase/specs/jls/se5.0/html/expressions.html#15.26.2 pour la définition de |=
. Les définitions sont exactement ce que vous pensez.
ce qui me surprend c'est l'absence d'un ||=
opérateur.
>>I'd be curious if right operand is evaluated if left value already is true.
opérateurs Bitwise (comme |
,&
, ..) évaluer les deux côtés, avant l'achèvement.
opérateurs Logiques (comme &&
,||
,..) pouvez sauter l'évaluation de la deuxième partie dans certains cas. Ceci est appelé short-circuit
.
les opérateurs de logique bitwise auront le même effet que les opérateurs de logique "normale" sur booléens.
Spécification Du Langage Java 15.22:
Lorsque les deux opérandes de &, ^, ou | opérateur sont de type booléen ou Booléen, alors le type d'expression de l'opérateur bitwise est booléen. Dans tous les cas, les opérandes sont sujettes à la conversion unboxing (§5.1.8).) en tant que de besoin.
pour &, la valeur de résultat est vraie si les deux opérande valeurs sont vraies; sinon, le résultat est faux.
For ^, la valeur de résultat est true si les valeurs de l'opérande sont différentes; sinon, le résultat est faux.
For/ , la valeur de résultat est false si les deux valeurs d'opérande sont false; sinon, le résultat est vrai.
la seule vraie différence est que les opérateurs bitwise ne peuvent pas être utilisés pour l'évaluation de court-circuit.
par exemple, ce code lancera NullPointerException
:
Boolean b1 = new Boolean(true);
Boolean b2 = null;
if (b1 || b2) {
//no null pointer here;
}
if (b1 | b2) {
//null pointer here;
}
ce n'est pas binaire c'est un "ou" qui signifie
val |= {something else}
est la même que l'expression Booléenne:
val == val or {something else}
qui est inclusif ou (le régulier ou utilisé dans les expressions mathématiques et l'informatique)
dans certains langages de programmation ou est noté par deux / / signes et dans certains par un / l'un D'eux est SQL et tous les langages de base de données que je connais de DTD JSON etc..