10
votes

Java opérateur ++ problème

Je me demande pourquoi le premier code de code est 000 tandis que le second est 123

premier: xxx

seconde: xxx < / Pré>

Quel est le différent entre ces deux codes, pourquoi le premier bloc n'augmente pas la valeur de la Z?


2 commentaires

Le premier code va boucler pour toujours et le second imprimera 01234


@Le Scrum Meister: Cette erreur m'a arrêté de répondre :(


9 Réponses :


8
votes

L'opérateur incrément déjà incrémente z code>, vous n'avez pas besoin d'attribuer la valeur de retour à z code>.

z++


0 commentaires

13
votes

z = z ++ est une erreur d'un programmeur - ce qu'elle fait est l'incrément z puis défini z sur son ancienne valeur - en conséquence, elle écrase Z avec son ancienne valeur et annule donc l'incrément .


2 commentaires

Pour être plus précis, c'est simplement une erreur logique. De toute évidence, cela compilera et courira juste bien (bien que dans l'exemple prévu, il entraînera une boucle infinie).


Oui, je cherchais le bon adjectif à utiliser avec l'erreur mot. ("Erreur sémantique" ou "Erreur de programmation")



1
votes

C'est parce que vous attribuez la valeur de z avec un opérateur Postfix.

http://download.oracle.com/javase/tatutorial/java/nutsandbolts/operators.html xxx

Les opérateurs postfix augmenteront la valeur de la valeur de z après l'attribution de i .

opérateur unaire ++ incrémentera la valeur de z Avant l'affectation de x .

pense à cela comme ++ avant Z AS +1 avant l'attribution, ++ Après z comme +1 après l'affectation.


1 commentaires

Je pense que c'est la bonne réponse, mais vous devriez probablement marcher sur ce que cela signifie, en particulier que le z ++ renvoie une valeur et que l'affectation utilise la valeur.



3
votes

Lorsque vous utilisez l'opérateur Post-Ingrement, vous n'avez pas besoin d'attribuer le résultat à la variable.

C'est-à-dire que votre code devrait ressembler à ceci: p>

int z=0;
    while(z<4)
    {
       z=++z;
       System.out.print(z);

    }


3 commentaires

... bien sûr, le programme correct serait juste z ++; ou ++ z; et pas z = ++ z; , mais bonne illustration de la différence.


Je pense que sa meilleure réponse Tanx


@shanky: Merci-- Si vous le pensez, n'hésitez pas à cliquer sur la coche sous la zone de vote, à gauche de la réponse :-)



0
votes

Le premier est probablement mieux écrit comme xxx pré>

ou p> xxx pré>

le pré-augmentation ici est important car il va incrémenter et puis assignez. Plutôt que d'assigner puis d'incrémenter - qui n'a aucun effet autre que de réinitialiser à 0 dans votre premier exemple. P>

car lorsque vous faites z = z ++ code> Il récupérera l'ancienne valeur de retour à z code> conduisant ainsi à une boucle infinie. p>

Le second se termine parce que vous n'êtes pas réaffectant à Z: P>

int z=0;
int x=0;

while(z<5)
{
    x=z++;
    System.out.print(x);
}


0 commentaires

0
votes

Si vous écrivez quelque chose comme foo = foo ++ , vous le faites mal. En général, si vous voyez une expression comme x = x ++ + ++ x; quelque chose est sérieusement faux. Il est impossible de prédire comment les expressions de ce type sont évaluées. Dans des langues telles que c , de telles expressions peuvent être évaluées car la mise en œuvre désire.

Je recommanderais vivement de jouer avec l'opérateur ++ car vous êtes obligé de Rencontrez-le lorsque vous lisez le code.

Comme d'autres ont signalé, x ++ est l'opérateur postfix et ++ x est un opérateur de préfixe. xxx

Notez que les valeurs de y , z et x sont ce qu'ils sont seulement < em> après l'expression est évaluée. Ce qu'ils sont pendant l'exécution n'est indéfini.

Donc, si vous voyez du code comme FOO (x ++, ++ x, x) , exécutez les collines .

Votre propre problème est plus succinctement écrit: xxx

Le code ci-dessus a l'avantage que la variable z est scopée dans la boucle pour , il ne peut donc pas entrer accidentellement avec une autre variable.


0 commentaires

2
votes

Je pense que cela vous donnera une assez bonne explication.

Considérez cette classe: P>

public void f();
  Code:
   0:   iconst_0
   1:   istore_1
   2:   iload_1
   3:   iinc    1, 1
   6:   istore_1
   7:   return
}


0 commentaires

3
votes

N'oubliez pas que Java évalue vos expressions droite à gauche forte> (juste comme C et C ++),

Donc, si votre code lit P>

z = z++


0 commentaires

-1
votes
z=z++;
This means first assign the value of z (which is in right position) to the z (which in left position), then do the increment in right z (which is of no use).

4 commentaires

Son simple écrit en une ligne, de sorte que l'utilisateur puisse comprendre facilement. Mais je pense que c'est de vous déranger, vous devriez donc faire un exercice et apprendre.


Son simple écrit en une ligne, de sorte que l'utilisateur puisse comprendre facilement. Mais je pense que c'est de vous déranger, vous devriez donc faire un exercice et apprendre. Le commentaire ci-dessus est pour 'Duncan'.


@Duncan: S'il n'y a rien de nouveau qui ne signifie pas que vous devriez avoir la bowevote et la réponse n'est pas non plus fausse. Je vous recommanderais donc de ne pas être trop intelligemment, et vous devriez lire et comprendre.


@Duncan: Si vous voulez être un homme bon, vous devriez être un bon auditeur et lecteur, mais vous n'êtes pas. Vous êtes trop confiant et toujours sous-estimer les autres. (Que vous avez prouvé). J'espère que vous comprendrez cela un jour. Bonne journée et au revoir