La réponse réelle est :
- Le compilateur donne préséance à "i == 0", qui vaut vrai.
- Il évaluera alors i=1 comme VRAI ou FAUX, et comme les opérateurs d'affectation compilés n'échouent jamais (sinon ils ne seraient pas compilés), il évalue également à vrai.
- Puisque les deux instructions sont évaluées comme vraies, et que VRAI && VRAI est évalué comme VRAI, l'instruction if sera évaluée comme VRAIE.
Pour le prouver, il suffit de regarder la sortie asm de votre compilateur pour le code que vous avez saisi (tous les commentaires sont les miens) :
mov dword ptr [rbp - 8], 0 ; i = 0;
cmp dword ptr [rbp - 8], 0 ; i == 0?
sete al ; TRUE (=1)
mov cl, al
and cl, 1 ; = operator always TRUE
movzx edx, cl
mov dword ptr [rbp - 8], edx ; set i=TRUE;
test al, 1 ; al never changed,
; so final ans is TRUE
La sortie asm ci-dessus provient de CLANG, mais tous les autres compilateurs que j'ai examinés ont donné une sortie similaire. Ceci est vrai pour tous les compilateurs de ce site, qu'ils soient des compilateurs C ou C++ purs, tous sans aucun pragme pour changer le mode du compilateur (qui par défaut est C++ pour les compilateurs C++).
Notez que votre compilateur n'a pas réellement défini i=1, mais i=TRUE (ce qui signifie toute valeur entière non nulle de 32 bits). C'est parce que l'opérateur && évalue seulement si une déclaration est VRAIE ou FAUX, et définit ensuite les résultats en fonction de ce résultat. Pour le prouver, essayez de remplacer i=1 par i=2 et vous pourrez constater par vous-même que rien ne change. Constatez par vous-même en utilisant n'importe quel compilateur en ligne à Explorateur de compilateurs
83 votes
Les gars, ce n'est pas une question de typographie. L'OP veut savoir pourquoi l'instruction if est entrée avec ce code puisque
i
est réglé sur1
.25 votes
Ou assigne-t-il le résultat de
1 && i == 0
?4 votes
Suggestion pour les débutants : Ils ne devraient pas utiliser une telle construction linguistique "avancée". Il suffit d'assigner la variable séparément. Cela évitera également d'éventuels problèmes avec le point de séquence. Ce type de code dans le code pratique sera généralement mauvais aussi.
2 votes
Cela va sûrement finir en question d'entretien.