web-dev-qa-db-fra.com

Pourquoi cette instruction if, avec une affectation et une vérification d'égalité, est-elle évaluée comme fausse?

Comment fonctionne un Java instruction if lorsqu'il a une affectation et un contrôle 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?

103
RoHaN

L'expression n'est pas analysée comme vous le pensez. Ce n'est pas

(test1=false) || (test1 == false)

auquel cas le résultat aurait été true, mais

test1 = (false || test1 == false)

La valeur de false || test1 == false l'expression est calculée en premier, et elle est false, car test1 est défini sur true dans le calcul.

La raison pour laquelle il est analysé de cette façon est que le précédence du || est inférieur à celui du ==, mais supérieur à la priorité de l'opérateur d'affectation =.

188
dasblinkenlight

Il s'agit essentiellement d'une question de priorité. Vous supposez que votre code est équivalent à:

if ((test1 = false) || (test1 == false))

... mais ce n'est pas. C'est en fait équivalent à:

if (test1 = (false || test1 == false))

... ce qui équivaut à:

if (test1 = (false || false))

(car test1 est true pour commencer)

... ce qui équivaut à:

if (test1 = false)

qui affecte la valeur false à test1, le résultat de l'expression étant false.

Voir le tutoriel Java sur les opérateurs pour un tableau utile de priorité des opérateurs.

83
Jon Skeet

please have a look over precedence of operators

Expression test1 = false || test1 == false sera évalué à l'étape suivante.

ÉTAPE: 1 -test1 = false || test1 == false // priorité de == est le plus élevé

ÉTAPE: 2 -test1 = false || false // Opérateur || ont une priorité plus élevée

ÉTAPE: 3 -test1 = false

ÉTAPE: 4 -false

Étant donné que la valeur booléenne de l'expression devient fausse, l'instruction else est en cours d'exécution.

2
user4768611