44 votes

Quel est le résultat de i == (i = 2)?

Exécutez le code suivant:

 // In Java, output #####
public static void main(String[] args) {
    int i = 1;

    if(i == (i = 2)) {
        System.out.println("@@@@@");
    } else {
        System.out.println("#####");
    }
}

Mais:

 // In C, output @@@@@I did test on Clion(GCC 7.3) and Visual Studio 2017
int main(int argc, char *argv[]) {
    int i = 1;

    if(i == (i = 2)) {
        printf("@@@@@");
    } else {
        printf("#####");
    }

    return 0;
}

La motivation pour poser cette question vient du code suivant:

 // The code is from the JDK 11 - java.util.concurrent.atomic.AtomicInteger
// I am curious about the behavior of the variable prev.
public final int getAndUpdate(IntUnaryOperator updateFunction) {
    int prev = get(), next = 0;
    for (boolean haveNext = false;;) {
        if (!haveNext)
            next = updateFunction.applyAsInt(prev);
        if (weakCompareAndSetVolatile(prev, next))
            return prev;
        haveNext = (prev == (prev = get()));
    }
}

Alors, comment expliquer les deux modes d'exécution différents ci-dessus?

5voto

John Bode Points 33046

En C, le comportement de i == (i = 2) n'est pas défini car il tente à la fois de mettre à jour un objet et d'utiliser la valeur de cet objet dans un calcul sans point de séquence intermédiaire. Le résultat variera en fonction du compilateur, des paramètres du compilateur et même du code environnant.

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