En Java, comment fonctionne un poste opérateur d'incrémentation loi dans une instruction de retour?
Donné le code suivant, sera ixAdd faire ce que vous attendez, j'. e. renvoyer la valeur de ix avant l'incrémentation, mais incrémenter le membre de la classe avant de quitter la fonction?
class myCounter {
private int _ix = 1;
public int ixAdd()
{
return _ix++;
}
}
Je n'étais pas tout à fait sûr si les règles habituelles de post /pré incrémentation s'appliquerait également à l'instruction return, lorsque le programme quitte le cadre de la pile (ou de ce qu'il est en Java) de la fonction.
- Pourquoi ne pas l'essayer?
- euh.. tu veux dire coller le code ci-dessus dans mon éditeur et de l'exécuter? Je ne sais pas, désolé. :-p je vais aller me chercher une tasse de café...
- voté pour fermer... je pensais que l'auteur pouvait fermer immédiatement?
- Hey, maintenant je sais pourquoi je n'ai pas essayer: Pour obtenir de Jon Skeet réponse. C'est plus utile que la question.
- c'est drôle comment il aurait été facile de simplement essayer 🙂
Vous devez vous connecter pour publier un commentaire.
La clé, c'est que un post incrémentation/décrémentation arrive immédiatement après l'expression est évaluée. Non seulement il ne se passera avant le retour se fait - il arrive avant tout plus tard, les expressions sont évaluées. Par exemple, supposons que vous avez écrit:
Qui permettrait d'imprimer la incrémenté résultat, parce que l'incrément qui se passe avant
giveMeZero()
est appelé.giveMeZero
méthode observe la valeur incrémentée.Bien, regardons le code binaire (utiliser
javap -c <classname>
pour voir par vous même):Comme vous pouvez le voir, les instructions, les 6 et 7 dans
ixAdd()
gérer l'incrément avant le retour. Donc, comme on pouvait s'y attendre, la diminution de l'opérateur, en effet, ont un effet lorsqu'ils sont utilisés dans une instruction de retour. Notez, cependant, qu'il y a undup
de formation avant ces deux apparaissent; la valeur incrémentée est (bien sûr) qui ne sont pas reflétées dans la valeur de retour.Oui, les règles habituelles s'appliquent pour la post-incrémentation, même sur une instruction de retour. Fondamentalement, ce qu'il fera à un niveau bas est de stocker la valeur de retour dans un registre, puis ajouter le membre de la classe, puis de retour à partir de la méthode.
Vous pouvez le voir dans une réponse plus tard à cette question qu'a montré le byte code.
Oui, il n'.
Mais ne le faites pas, il est mauvais style pour avoir des effets de bord dans les expressions.
Elle retourne la valeur avant incrémentation, et puis incrémenter _ix. Donc la première fois que vous appelez la méthode ixAdd sur une instance de myCounter il sera de retour 1, la deuxième fois, il sera de retour 2, et ainsi de suite.