29 votes

Pourquoi (boolean ^ int> 0) fonctionne-t-il?

Lorsque vous essayez de faire quelque chose comme ceci:

if (true ^ 1) {
  //do something
}

le compilateur raisonnablement dit que l'opérateur ^ n'est pas définie pour les types d'argument booléen et int. Mais si vous l'utilisez comme ceci:

if (true ^ 1 > 0) {
  //do something
}

le code se compile (pour Java 8 au moins) et fonctionne parfaitement. Fondamentalement, ces opérations:

false ^ -1 > 0 
false ^ 1 > 0
true ^ -1 > 0
true ^ 1 > 0

Agir comme un valide logique XOR:

     | ^
-----+--
 F F | F
 F T | T
 T F | T
 T T | F

Quelqu'un pourrait-il expliquer ce qui se passe sous le capot?

78voto

Jon Skeet Points 692016

C'est simple: > a une plus grande priorité que ^, de sorte

if (true ^ 1 > 0) {

est équivalent à

if (true ^ (1 > 0)) {

ce qui est équivalent à

if (true ^ true)

... qui est juste logique XOR.

Je n'aurais jamais écrire ce code, vous l'esprit. Je serais surpris de voir un exemple qui ne pouvait pas être écrit plus clairement dans une manière différente.

11voto

Andremoniy Points 7349

Parce que l'opération > a une priorité plus élevée que ^ , elle est donc équivalente à true ^ (1>0) qui fonctionne avec les mêmes types (booléen ^ booléen).

10voto

GhostCat Points 83269

1 est de type int.

1> 0 est de type booléen.

^ signifie XOR; et vous ne pouvez pas XOR booléen et int.

En d'autres termes: la première expression "1" correspond à un nombre; la deuxième expression "1> 0" est évaluée en logique booléenne. La raison derrière cela est la prédécence de l'opérateur.

3voto

MateuszW90 Points 779

Parce que l'ordre (priorité) des opérations est important, > a une priorité plus élevée que ^

Ici, nous vérifions d'abord 1 > 0 , puis la première opération est XORed ( ^ ) avec le premier résultat

Est équivalent à if(true ^ (1 > 0 ))

Mais, bien sûr, vous ne pouvez pas XORed booléen avec int

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X