IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

L'opérateur d'incrémentation en Java


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    173
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 173
    Par défaut L'opérateur d'incrémentation en Java
    Bonjour tout le monde,

    En préparant le certification programmeur java de sun, je suis tombé sur une question que je n'arrive pas à comprendre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    int i = 0;
    		i += ++i + i++;
    		System.out.print(i);
    Est ce que quelqu'un peut m'expliquer le résultat, notemment me dire, comment cela se calcul, qui se fait avant quoi?

    Merci d'avance

  2. #2
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 096
    Par défaut
    Ton probleme je suppose se situe au niveau de :


    i++ : post increment (rajoute 1 apres avoir assigné/evalué)
    ++i : pré increment (rajoute 1 avant d'avoir assigné/evalué).

    Je dirais si je ne me trompe pas que cela peut etre decomposé en :

    i = i + (++i + i++);
    i = i + (i + (i+1)++);
    i = i + (i + (i+2));
    i = i + (i + i + 2);
    i = 3 * i + 2;

    -> i = 3 * 0 + 2;
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Par défaut
    bonjour,
    wax78 le raisonnement est pas mal mais je dirais plutôt comme suis :

    selon la JLS cette expression est equivalente a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    i = 0;
    i = i + ++i + i++;
    System.out.print(i);
    l'expression est prise de droite a gauche donc :
    - i + : i egal 0
    - ++i : sera incrémenté de 1 puis ajouté à 0 (on a donc 1)
    - i++ : i + 1 sera effectué après l'operation d'addition
    - i = : on affecte le resultat

    on a donc au final : 0 + 1 + 1
    ce qui donne 2
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Alors, je dis ça en m'aidant des JLS, mais voici ma compréhension :

    En général,

    est un raccourci signifiant

    De plus, dans une expression, les opérandes sont évaluées séparément, de gauche à droite. Une opérande est évaluée entièrement avant de passer à la suivante.

    Donc, dans le cas de :

    Cette notation signifie en réalité :

    Regardons un peu ce que ça donne :

    Première opérande : i.
    À ce moment-là, i vaut toujours zéro. Opération neutre.

    deuxième opérande : ++i.
    Avant cette expression, i vaut toujours zéro. L'opération incrémente i, qui vaut alors 1. Puis elle renvoie i, qui vaut 1.

    troisième opérande : i++.
    Avant cette expression, i vaut 1 parce que l'expression précédente a été évaluée. L'opération incrémente i, qui vaut alors 2. Puis elle renvoie la valeur que i avait avant l'expression, c'est-à-dire 1.
    Après évaluation de cette opérande, i vaut 2.

    Donc, l'expression complète est une addition :

    et les effets de bords de cette expression font que i vaut 2 après son évaluation.

    Cette addition vaut 2. Nous appliquons donc :

    Et donc, quelle que soit la valeur que i peut avoir à ce moment-là, cette valeur est écrasée, et remplacée par 2.

    Conclusion, après cette instruction, i vaut 2.

    Edit : Grumpf, je me suis encore fait griller .
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Par défaut
    OK thelvin

    j'ajouterais une précision c'est que les additions sont effectué au fur et a mesure. On a donc en réalité
    et ensuite :
    cela devient intéressant si l'on inverse ++i et i++ et cela verifie ce que je viens de dire
    En effet dans ce cas on aura
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    i = 0 + 0; // pour le ++i dans i + ++i
    et ensuite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    i =  1 + 1; // pour le i + i++
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    173
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 173
    Par défaut
    Merci a tout le monde.

    Effectivement, j'ai fais à peut pres le meme raisonnement et la question que je me posait.

    en partant de i=0;
    et on fait ++i; on se trouve avec i=1;
    alors le i++ se fera sur la base de i=0 ou i=1? apparemment i=0!

    puis l'addition vient apres.

    C'est cool

  7. #7
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par amine_en_france Voir le message
    apparemment i=0!
    Le contraire, on a dit.

    i++ se fait après ++i, et ++i a porté la valeur de i à 1.
    Donc i++ se fait sur la base i=1, et renvoie donc 1. Son effet de bord est sans importance, puisqu'à la fin la valeur de i est écrasée.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    173
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 173
    Par défaut
    zut

    Tu as raison,

    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Incrémenter le nom d'une variable en Java
    Par jmnicolas dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 08/04/2008, 16h05
  2. Opérateur ~ en Java
    Par soft0613 dans le forum Langage
    Réponses: 2
    Dernier message: 11/02/2008, 21h54
  3. [Java] problème Float incrémentation
    Par [Nean] dans le forum Langage
    Réponses: 6
    Dernier message: 25/04/2007, 17h10
  4. [java] pb Opérateur ternaire
    Par phileme dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 04/07/2004, 13h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo