2011-06-26 4 views
-2

Je ne sais pas si cela est compilateur spécifique, mais quand j'ai essayé de courir les deux expressions DevC++Différence de sortie de i = i ++ + ++ c; et i = ++ i + C++;

Lorsque i=c=b=0;i=i++ + ++c donne 2 alors i=++i + c++ donne 1

Mais b=i++ + ++c et b=++i + ++c produit le résultat 1 pour les deux expressions. Je sais que l'incrémentation d'une variable deux fois dans la même expression aboutit à une valeur indéfinie selon la spécification standard C, mais je suis curieux de savoir comment le compilateur produit ces résultats. Quelqu'un pourrait-il expliquer comment et pourquoi?

+5

Comportement indéfini. [Les démons peuvent voler hors de votre nez] (http://www.urbandictionary.com/define.php?term=nasal%20demons). En fait, cette question serait intéressante si vous n'attribuez pas le résultat à 'i', ce qui provoque le comportement indéfini. –

+0

@Fred Larson dans le 2ème exemple, il ne valide pas, mais le premier est indéfini comme vous l'avez mentionné –

+0

@Jesus: Je vois l'assignation de retour à «i» dans les deux, donc les deux sont un comportement indéfini. Pas de point de séquence entre l'affectation et l'incrément. –

Répondre

0

i++ et ++i sont complètement différents, i++ est incrément après ce qui signifie évaluer i dans l'expression puis incrémenter une fois son évaluation. ++i signifie incrémenter puis évaluer l'expression. Je vois dans votre exemple que vous définissez i = ++i/i++, ce comportement est indéfini comme mentionné dans un commentaire.

3

i++ + ++c, le c est incrémenté (-1), puis 0 + 1 est stocké dans i, et enfin i est incrémenté, ce qui donne 2.

++i + c++, le i est incrémenté (-1), puis 1 + 0 est stocké dans i, puis c est incrémenté.

Voilà comment je comprendrais ce que le compilateur a fait, mais comme tout le monde le dit, ne comptez pas sur ce comportement ailleurs.

1

Êtes-vous sûr que b = ++ i + ++ c = 1? ou était-ce b = ++ i + C++? Voici mon explication de votre question.

i = i++ + ++c 
    (i = 0 + 1)++ 
    i = 2 
    c = 1 

    i = ++i + c++ 
    (i = 1 + 0) 
    i = 1 
    c = 1 
0

La norme C99 dit explicitement (6.5, p2)

Entre la séquence précédente et du prochain point d'un objet doit avoir sa valeur stockée modifiée au plus une fois par l'évaluation d'une expression.

Les expressions i = ++i; et i = i++; à la fois la mise à jour i deux fois, ce qui est interdit.

Questions connexes