Comment fonctionne une instruction Java if lorsqu'elle a une affectation et une vérification d'égalité OR
-d ensemble?
public static void test() {
boolean test1 = true;
if (test1 = false || test1 == false) {
System.out.println("TRUE");
} else {
System.out.println("FALSE");
}
}
Pourquoi cette impression est-elle FAUX?
java
if-statement
logic
RoHaN
la source
la source
test1=false
,test1==false
estfalse
,false || false
estfalse or false
qui estfalse
.test1 = true
Réponses:
L'expression n'est pas analysée comme vous le pensez. Ce n'est pas
auquel cas le résultat aurait été
true
, maisLa valeur de l'
false || test1 == false
expression est calculée en premier, et c'est le casfalse
, car elletest1
est définie pourtrue
entrer dans le calcul.La raison pour laquelle il est analysé de cette façon est que la priorité du
||
est inférieur à celui de l'==
opérateur, mais supérieur à la priorité de l'opérateur d'affectation=
.la source
((test1 = false) || test1 == false)
la valeur globale seraittrue
.==
c'est au-dessus||
, mais en=
dessous||
.||
). La priorité relative de||
et==
ne concerne que pour montrer que l' analyse syntaxique est pas comme danstest1 = ((false || test1) == false)
, que je ne pense pas que quiconque peut raisonnablement s'attendre (par la façon dont la priorité relative, ou plus généralement||
,&&
ont une priorité plus faible que les relations, est aussi facile à rappelez-vous, depuis utilisé tout le temps).||
et==
vs||
et=
explique pourquoi cela se comporte différemment du cas (courant) dea == b || c == d
.Il s'agit essentiellement d'une question de priorité. Vous supposez que votre code équivaut à:
... mais ce n'est pas. C'est en fait équivalent à:
... ce qui équivaut à:
(parce que
test1
c'esttrue
pour commencer)... ce qui équivaut à:
qui affecte la valeur
false
àtest1
, le résultat de l'expression étantfalse
.Consultez le didacticiel Java sur les opérateurs pour un tableau utile de la priorité des opérateurs.
la source
Expression
test1 = false || test1 == false
sera évaluée à l'étape suivante.ÉTAPE: 1-
test1 = false || test1 == false
// priorité de==
est la plus élevéeÉTAPE: 2-
test1 = false || false
// Opérateur||
ont une priorité plus élevéeÉTAPE 3-
test1 = false
ÉTAPE 4-
false
Puisque la valeur booléenne de l'expression devient fausse, l'instruction So else est en cours d'exécution.
la source
(test1 = false || test1 == false)
renvoie false, car les deux sont faux.(test1 = false || test1 == true)
c'est vrai parce que l'un d'eux est vraila source