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 :

Problème d'analyse d'un code


Sujet :

C

  1. #1
    Membre averti
    Inscrit en
    Septembre 2008
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 17
    Par défaut Problème d'analyse d'un code
    Bonsoir!

    Je voulais savoir si quelqu'un pouvait m'aider à analyser ces quelques lignes de codes:

    int a=30, b=10, c[3]={5,15,4}, *p;
    p=c;

    printf ("%d %d %d %d %d\n\n", a, b, p[0], p[1], p[2]); // 30, 10, 5, 15, 4

    printf ("%d\n", a/=*p++);

    printf ("%d\n", (*(p++)%= (++a-1)) );

    printf ("%d\n", *p=!(*p-4));

    printf ("%d\n", b+=*p--);

    printf ("%d\n", 2+(a=*(p=c)+3));

    printf ("%d %d %d %d\n",b, p[0],a, *(c+2));
    Pour la première ligne, aucun souci, en revanche pour les suivantes, j'ai beau consulter les normes, j'ai vraiment du mal à trouver le résultat voulu de tête.

    Par exemple, pour la seconde ligne j'aurais bien dit que le résultat affiché vaut 7, ce qui n'est pas le cas.
    En effet:

    a/=*p++
    > a= a/*p++
    > a= 30/5 ++
    D'ou a=7...

    Bien évidemment je sais que j'ai faux, mais j'aimerais bien en connaitre la raison.

    Merci d'avance

  2. #2
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Et avec ce tableau de Priorité des opérateurs ?

  3. #3
    Membre averti
    Inscrit en
    Septembre 2008
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 17
    Par défaut
    Merci pour le tableau mais je l'ai déja vu une dizaine de fois -_-

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 461
    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 461
    Par défaut
    Citation Envoyé par sepnar Voir le message
    Merci pour le tableau mais je l'ai déja vu une dizaine de fois -_-
    Les opérateurs de pré/post incrémentation/décrémentation ont une haute priorité car ils servent à agir sur l'entité qu'ils suivent ou précèdent, en général de manière transparente, et pas sur une expression entière, ce qui n'aurait généralement aucun intérêt.

    Dans le cas de la deuxième ligne, donc, « ++ » s'applique à « p » uniquement. Comme c'est un opérateur postfixe, c'est la valeur originale de p qui sera impliquée dans l'expression. Le pointeur sera incrémenté ultérieurement.

    Exemple plus simple : admettons que « p » soit un « const char * » et qu'il pointe donc une chaîne de caractères :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    while (*p!='\0') putchar (*p++);

    Ce code permet de se référer à chaque caractère pointé et d'incrémenter automatiquement le pointeur une fois l'opération effectuée.

  5. #5
    Membre averti
    Inscrit en
    Septembre 2008
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 17
    Par défaut
    Merci pour ta réponse Obsidian.
    C'est très clair précis et complet.

    J'ai cependant une dernière difficulté avec le modulo de la troisième ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf ("%d\n", (*(p++)%= (++a-1)) );
    Je déduis de cette ligne que (p++) s'effectue en premier (car parenthèses) dc *p pointera sur la valeur 4 du tableau.
    Ce qui donne *p= 4 modulo 30 ???
    Le résultat étant 6, j'ai du eencore me planter quelque part.

    Sinon les autres lignes étant indépendantes de celle-ci, elles ne m'ont plus posé problème.

  6. #6
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Citation Envoyé par sepnar Voir le message
    Je déduis de cette ligne que (p++) s'effectue en premier (car parenthèses) dc *p pointera sur la valeur 4 du tableau.
    Si tu avais pris la peine de lire calmement le tableau que je t'avais passé en lien, tu aurais su que parenthèse ou pas ++ est plus prioritaire que *.
    Citation Envoyé par sepnar Voir le message
    Le résultat étant 6, j'ai du eencore me planter quelque part.
    Le résultat est 3 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    30 10 5 15 4
    
    6
    3
    1
    11
    10
    11 5 8 1
    Le résultat de p++ est la valeur stocké dans p avant son incrémentation, dans notre cas c'est l'adresse de c[1] un *p++ donnera donc 15, un ++a-1 est égal à a qui dans ce cas est de 6, ce qui revient à calculer 15%6.

  7. #7
    Membre averti
    Inscrit en
    Septembre 2008
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 17
    Par défaut
    Dslé si ma première réponse semblait un peu sèche ssmario2, mais je préfère largement ta seconde réponse.
    Bref, en effet pour la priorité, j'ai négligé l'associativité.. Mais de toutes façons, elle importe peu ici.
    Et sinon, j'ai pris a=30 mais ça c'est de l'inattention.

    Tout cas merci, problème résolu.

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

Discussions similaires

  1. [68k] Problème sur un exemple de code
    Par jib2b dans le forum Autres architectures
    Réponses: 2
    Dernier message: 19/04/2006, 23h10
  2. Problème de paramètres dans mon code javascript
    Par cocacollection dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 15/03/2006, 10h53
  3. Réponses: 1
    Dernier message: 29/11/2005, 22h05
  4. Problème avec Between dans un code
    Par Sendo dans le forum Access
    Réponses: 4
    Dernier message: 02/10/2005, 18h44
  5. Outils d'analyse statique de code assembleur ?
    Par atomic dans le forum Assembleur
    Réponses: 4
    Dernier message: 11/06/2004, 11h42

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