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?

24
demandé sur NPE 2013-03-14 17:52:31

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 de E1 sauf que E1 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 type boolean ou Boolean, alors le type de l'expression opérateur bitwise est boolean. 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 ou Boolean 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.

29
répondu NPE 2013-03-14 14:29:13

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.

4
répondu Theodore Norvell 2013-03-14 13:57:11
>>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.

2
répondu Ostap Andrusiv 2013-03-14 14:01:57

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;
}
2
répondu Jean Waghetti 2013-03-14 14:02:03

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..

0
répondu sivi 2013-03-14 16:47:54