2010-09-28 5 views
4

En regardant le code:assignation et la comparaison

int i = 5; 
if (i = 0) 
{ 
    printf ("Got here\n"); 
} 

Qu'est-ce que la norme C ont à dire sur ce qui s'imprimé? Ou, en termes plus généraux, l'assignation a-t-elle lieu en premier ou la comparaison?

+0

De quelle affectation vous inquiétez-vous. Notez également qu'il n'y a pas de comparaison (cela est fait avec ==) –

Répondre

10

§6.8.4 dit que la syntaxe d'une instruction de sélection if est:

if (expression) statement

De plus, dans cette section, il mentionne que si l'expression compare l'inégalité à 0, puis statement est exécutée. L'expression doit donc être évaluée avant de pouvoir être comparée à 0. i = 0 est une expression qui vaut 0. Pour plus de détails, voir §6.5 “ Expressions ” en ce qui concerne le §6.5.16 “ Opérateurs d'affectation ”, en particulier noter cet extrait :

Un opérateur d'affectation stocke une valeur dans l'objet désigné par l'opérande de gauche. Une expression d'affectation a la valeur de l'opérande gauche après l'affectation, mais n'est pas une valeur lvalue.

1

L'affectation se produit, ce qui renvoie un 0, ce qui est faux.

5

Affectation d'abord, car elle fait partie de l'évaluation. L'expression de l'affectation renvoie la valeur affectée, de sorte que l'expression est évaluée comme false.

+0

Toute référence à la norme? – doron

+1

Je ne sais pas quelle partie du standard que vous voulez citer ... les affectations sont des expressions, et un 'if' doit évaluer son expression avant de déterminer la vérité de cette expression (par définition). – rmeador

0

L'expression de la clause if est évaluée en premier, dont le résultat est 0.

Ce programme ne sera jamais imprimé « Vous avez ici \ n ».

3

i=0 évalue à 0 ainsi la sortie ne se produira pas.

L'affectation antérieure (la première ligne du code source) n'a aucune incidence sur le résultat.

+0

Oui, il est, je vérifie la vérité. Si i est mis à zéro avant la comparaison, alors nous n'imprimons pas Got here, si la comparaison arrive d'abord, nous le faisons. – doron

+0

@doron - montrez-moi quelle ligne de code est la comparaison, et je vais modifier en conséquence. Merci –

+0

la norme C dit que l'expression elle-même est comparée à 0, et que la sous-instruction d'une instruction de sélection if est seulement exécutée si l'expression compare inégale à 0. Je pense que @doron veut savoir si la comparaison se produit après avant l'affectation. – dreamlax

2

L'instruction i = 0 sera évaluée et renverra 0, de sorte que l'instruction ne sera pas imprimée.

0

Comme d'autres l'ont déjà dit, l'affectation retourne la valeur de ce qui est assignée et n'imprime donc jamais l'instruction. Si vous voulez que l'instruction soit imprimée, vous devrez utiliser if (i = -1).

0

Rien ne s'imprimera. Le 0 est assigné à i et ensuite cette valeur est testée pour la condition.

2

Lorsque l'affectation se produit est sans importance. Ce qui est pertinent est la valeur de i=0 comme une expression, et il est défini pour avoir la valeur 0.