J'ai pensé à quelques erreurs de débutant et je me suis retrouvé avec celui sur la if
déclaration. J'ai développé un peu le code à ceci:
int i = 0;
if (i = 1 && i == 0) {
std::cout << i;
}
Je l' ai vu que les if
déclarations de déclaration vrai, et il cout
est i
comme 1
. Si i
est affecté 1
dans l'instruction if, pourquoi est-il i == 0
revenu true
?
c++
if-statement
TehMattGR
la source
la source
i
est défini sur1
.1 && i == 0
?Réponses:
Cela a à voir avec la priorité des opérateurs .
n'est pas
parce que les deux
&&
et==
ont une priorité plus élevée que=
. Ce que ça donne vraiment, c'estqui affecte le résultat de
1 && (i == 0)
ài
. Donc, sii
commence à0
alorsi == 0
esttrue
, il en1 && true
est de mêmetrue
(ou1
), puisi
est réglé sur1
. Puisqu'il1
est vrai, vous entrez le bloc if et imprimez la valeur que vous avez affectéei
.la source
i = !i; if (i)
correctement écritEn supposant que votre code ressemble à ceci:
Ensuite ceci:
évalue comme
et
i
est donc réglé sur1
.la source
using namespace std
!=
produise avant&&
puisse voir le problème. De plus, oui, l'expansion est superflue, mais je ne pense pas que cela compte autant. Je ne peux pas croire que de telles différences mineures poussent les gens à voter de 151 à -4.Cela a à voir avec l'analyse des règles de droite à gauche. Par exemple, y = x + 5.
Toutes les sous-expressions sont pondérées en importance. Deux expressions d'égale importance sont évaluées de droite à gauche,. Le côté expression && est effectué en premier, suivi du LHS.
Ça a du sens pour moi.
la source
La vraie réponse est:
Pour preuve, regardez simplement la sortie asm de votre compilateur pour le code que vous avez entré (tous les commentaires sont les miens):
La sortie asm ci-dessus provenait de CLANG, mais tous les autres compilateurs que j'ai examinés ont donné une sortie similaire. Cela est vrai pour tous les compilateurs sur ce site, qu'ils soient de purs compilateurs C ou C ++, tous sans pragmas 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 32 bits non nulle). En effet, l'opérateur && évalue uniquement si une instruction est VRAI ou FAUX, puis définit les résultats en fonction de ce résultat. Pour preuve, essayez de changer i = 1 en i = 2 et vous pouvez constater par vous-même que rien ne changera. Voyez par vous-même à l'aide de n'importe quel compilateur en ligne dans Compiler Explorer
la source
i = 1
est un opérateur d'assignation [et non un équivalent]; 2b) Je peux vous assurer queif (i = 0)
sera évalué à une condition fausse en C et C ++, donc si cela correspond à true wrt "it never fail" est quelque peu trompeur.and cl, 1 ; = operator always TRUE
<< corrigez-moi si je me trompe, mais je ne vois aucune affectation ici. Il représente la1 &&
partie de l'expression. Donc, cette réponse est essentiellement évaluéefalse
.if ( i = 0 ) { print something }
. Votre réponse se contredit également; au début, vous dites que ce quii=1
est évalué avant&&
est appliqué, puis à la fin, vous dites qu'ili
est défini sur le résultat de l'&&
opérateur.