2010-03-04 21 views

Répondre

34

Oui, il est équivalent à:

int bar() 
{ 
    int temp = x; 
    ++x; 
    return temp; 
} 
+0

Bonne explication, merci. – patros

+0

Si 'int' n'est pas un' int', mais un 'MyClassWithOverloadedOperators', alors vous avez tort. –

+4

@Pavel: Je ne suis pas d'accord. Une classe avec un opérateur post-incrément surchargé qui n'implémente pas la sémantique de post-incrémentation correcte est incorrecte. – Void

7

Oui c'est ... il retournera la valeur de x avant de l'incrémenter et après cela la valeur de x sera + 1 ... si c'est important.

4

Il est défini.

Renvoie la valeur de x avant l'incrémentation. Si x est une variable locale (non statique), cette post-incrémentation n'a aucun effet puisque les variables locales d'une fonction cessent d'exister une fois la fonction retournée. Mais si x est une variable statique locale, une variable globale ou une variable d'instance (comme dans votre cas), sa valeur sera incrémentée après le retour.

+0

Mais que se passe-t-il dans le cas d'un opérateur «++» surchargé sur une classe personnalisée? Est-ce que l'effet sera effectué? – Dario

+2

@Dario Oui, ce sera le cas. L'expression suivant "return" sera entièrement évaluée avant que le retour ne soit exécuté. –

+1

@Dario. Oui, exactement pour la même raison que si vous faites 'return x.dosomething();', l'effet de 'dosomething' sera effectué avant le retour. Post-incrément surchargé n'est pas magique, c'est juste une fonction qui renvoie une valeur, qui se trouve être l'ancienne valeur. –

4

Oui.

Dans postincrement (x ++) la valeur de x est évalué (retourné dans votre cas) avant 1 est ajouté. En preincrement (++ x), la valeur de x est évaluée après 1 est ajouté.

Modifier: Vous pouvez comparer la définition de pre et post incrément dans les liens.

1

La plupart des langages de programmation, comme C++, sont récursifs dans l'ordre où les opérations sont effectuées (je ne fais aucune implication sur la façon dont le code est implémenté par le compilateur ici). Les opérations composées composées de toutes les opérations bien définies sont elles-mêmes bien définies, puisque chaque opération est effectuée selon la méthode du dernier entré, premier sorti. Le post-incrément retourne la valeur de la variable incrémentée avant l'incrémentant, l'opération return reçoit cette valeur. Aucune définition particulière de ce comportement ne doit être faite.

+1

Je ne pense pas que l'on se souciait de la valeur qui serait restituée, mais plutôt de savoir si l'augmentation se produirait. C'est une préoccupation compréhensible si votre modèle mental l'a que "retour" provoque une fin immédiate de la fonction - est-ce qu'il y a vraiment du temps pour que l'incrément soit appliqué si la fonction est déjà terminée? Bien sûr, nous savons que la réponse est * oui *, mais seulement parce que le compilateur effectue une transformation comme dans la réponse de Poita pour s'assurer que la fonction ne retourne pas réellement tant que tous les effets secondaires n'ont pas été appliqués. –

+0

Voilà ce que je veux dire. L'instruction 'return' est rencontrée après' x ++ '" renvoie ". Puisque 'x ++' est une opération, il faut penser à retourner comme dans le code de démonstration fourni par Poita_. De cette façon, il est facile de voir que puisque x ++ est exécuté et que sa valeur de retour est passée à l'instruction return. Cela n'a pas de sens que «x ++» revienne et * alors * incrémente. –