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

 C Discussion :

Compréhension de code : incrémentation


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Pâtissier
    Inscrit en
    Avril 2014
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Pâtissier

    Informations forums :
    Inscription : Avril 2014
    Messages : 32
    Par défaut Compréhension de code : incrémentation
    Bonjour, bonsoir,
    Je ne comprends pas un bout de code :

    Pour l'exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if(tab[2]++ >= 57)
    {
            tab[2] = 48;
    	tab[1]++;
    }
    Que veut dire le tab[2]++
    Ce n'est pas une incrementation si ?
    Car si je le remplace par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if(tab[2] + 1 >= 57)
    {
    	tab[2] = 48;
    	tab[1]++;
    }
    … il ne se passe pas la même chose.
    Voila si quelqu'un pouvait m'éclairer sur le sujet, merci =)

  2. #2
    Membre émérite
    Avatar de Daïmanu
    Homme Profil pro
    Développeur touche à tout
    Inscrit en
    Janvier 2011
    Messages
    735
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur touche à tout

    Informations forums :
    Inscription : Janvier 2011
    Messages : 735
    Par défaut
    Bonsoir.

    Il s'agit en effet d'une incrémentation, mais avec une subtilité : c'est une post-incrémentation. Le ++ sera appliqué après la comparaison.
    Autrement dit, if(tab[2]++ >= 57) est équivalent à if(tab[2] >= 57) tab[2]++, le ++ sera appliqué que la comparaison soit vraie ou non, mais après la comparaison.
    Ton exemple est une pré-incrémentation, où le + 1 s'effectue avant.

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 473
    Par défaut
    Bonsoir,

    Citation Envoyé par Daïmanu Voir le message
    Autrement dit, if(tab[2]++ >= 57) est équivalent à if(tab[2] >= 57) tab[2]++, le ++ sera appliqué que la comparaison soit vraie ou non, mais après la comparaison.
    Ton exemple est une pré-incrémentation, où le + 1 s'effectue avant.
    Pas tout-à-fait :

    • « x++ » est une post-incrémentation. x sera incrémentée dans tous les cas, après avoir été évaluée, et qu'elle soit impliquée ou non dans une comparaison ne change rien. En outre, le moment exact où cette incrémentation sera effectuée peut varier, mais elle le sera toujours avant un point de séquence ;
    • « ++x » est une pré-incrémentation. x sera donc incrémentée avant d'être évaluée ;
    • « x + 1 » est une expression mathématique qui est elle-même évaluée comme le reste. Et pour ce faire, le compilateur va d'abord évaluer chaque terme de cette expression, dont x, pour effectuer le calcul mais au final, x proprement dite restera inchangée contrairement aux deux premiers cas ci-dessus.


    La comparaison qui nous intéresse ici, enfin, est elle-même une expression mathématique, évaluée elle-aussi, et dont le type est un booléen. C'est important car cela signifie qu'on connaît forcément le type à l'avance avant même de calculer le résultat. Et là encore, ce calcul s'effectue en évaluant préalablement et récursivement tous les termes et sous-termes de cette expression.

  4. #4
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Billets dans le blog
    21
    Par défaut
    Si le résultat est le même dans les deux cas, c'est que tu assignes la valeur 48 à tab[2] par la suite. Si ton test ( tab[2]++ >= 57 ) était faux, tu verrais une différence entre tab[2]++ et tab[2]+1 en fin de programme.

    Pour bien comprendre la différence entre pré et postincrémentation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    int preincrement(int& i) { // ++i
      i += 1;
      return i;
    }
     
    int postincrement (int& i) {  //i++
      int t = i;
      i += 1;
      return t;
    }
    dans la plupart des cas mieux vaut ++i que i++ : tu évites de créer une variable temporaire et c'est plus lisible (en tout cas c'est un avis partagé)

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Dommage que le premier réflexe qu'on nous apprenne pour "incrémenter une variable" soit i++, et non l'inverse. Enfin sur un type primitif, le coût est négligeable car le compilo peut détecter que la valeur de sortie n'est pas utilisée, et faire la transformation lui-même. Par contre, sur une classe, c'est bien moins évident...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre averti
    Homme Profil pro
    Pâtissier
    Inscrit en
    Avril 2014
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Pâtissier

    Informations forums :
    Inscription : Avril 2014
    Messages : 32
    Par défaut
    Merci pour ces réponses =)

  7. #7
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Dommage que le premier réflexe qu'on nous apprenne pour "incrémenter une variable" soit i++, et non l'inverse. Enfin sur un type primitif, le coût est négligeable car le compilo peut détecter que la valeur de sortie n'est pas utilisée, et faire la transformation lui-même. Par contre, sur une classe, c'est bien moins évident...
    C'est une bonne remarque.... si on fait du C++

    Il est vrai que beaucoup de personnes faisant du C finiront par aller vers le C++, donc je mets .

    dans la plupart des cas mieux vaut ++i que i++ : tu évites de créer une variable temporaire et c'est plus lisible (en tout cas c'est un avis partagé)
    Ceci serait à vérifier dans le code généré mais je pense qu'un compilateur moderne, dés -O1, génère le même code pour i++; et ++i;, avec int i = 0;.

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

Discussions similaires

  1. besoin d'aide pour comprendre Example zope
    Par julien.63 dans le forum Zope
    Réponses: 3
    Dernier message: 22/08/2007, 15h41
  2. MVC besoin d'aide pour comprendre
    Par damien77 dans le forum Servlets/JSP
    Réponses: 11
    Dernier message: 26/06/2007, 12h17
  3. besoin d'aide pour comprendre un exo simple de java
    Par chadel dans le forum Langage
    Réponses: 2
    Dernier message: 16/03/2007, 23h27
  4. [MySQL] besoin d'aide pour comprendre les injections sql
    Par cassy dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 28/01/2007, 14h21
  5. Besoin d aide pour comprendre un code
    Par litlebasic dans le forum Delphi
    Réponses: 4
    Dernier message: 22/06/2006, 13h00

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