web-dev-qa-db-fra.com

Pourquoi cette instruction if combinant affectation et vérification d'égalité renvoie-t-elle true?

J'ai pensé à quelques erreurs de débutant et je me suis retrouvé avec celui sur l'instruction if. J'ai développé un peu le code à ceci:

int i = 0;
if (i = 1 && i == 0) {
    std::cout << i;
}

J'ai vu que l'instruction if renvoie vrai, et que cout est i comme 1. Si i est affecté 1 dans l'instruction if, pourquoi i == 0 return true?

214
TehMattGR

Cela a à voir avec priorité de l'opérateur .

if (i = 1 && i == 0)

n'est pas

if ((i = 1) && (i == 0))

car && et == ont tous deux une priorité plus élevée que =. Ce que ça donne vraiment, c'est

if (i = (1 && (i == 0)))

qui affecte le résultat de 1 && (i == 0) à i. Donc, si i commence à 0 Alors i == 0 Est true, donc 1 && true Est true (ou 1), Puis i est défini sur 1. Puis, puisque 1 Est vrai, vous entrez le bloc if et imprimez la valeur que vous avez attribuée à i.

388
NathanOliver

En supposant que votre code ressemble à ceci:

#include <iostream>
using namespace std;

int main()  {
    int i = 0;
    if (i = 1 && i == 0) {
        cout << i;
    }
}

Ensuite ceci:

if (i = 1 && i == 0) {

évalue comme

 if (i = (1 && i == 0)) {

et donc i est défini sur 1.

16
user2100815