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 :

instruction de test


Sujet :

C

  1. #1
    Membre averti
    Inscrit en
    Février 2010
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 22
    Par défaut instruction de test
    salut
    j'arrive pas a comprendre comment cette instruction sera traitée par le compilateur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    int a=16 , b=8, c=4;
    c* = !(a%2) ? (a-- , b++) : 1 ;

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 444
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 444
    Par défaut
    Citation Envoyé par Débutant_ASM Voir le message
    salut
    j'arrive pas a comprendre comment cette instruction sera traitée par le compilateur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    int a=16 , b=8, c=4;
    c* = !(a%2) ? (a-- , b++) : 1 ;
    C'est un exercice scolaire ?

    « … ? … : … » est un opérateur ternaire. Il s'agit d'une sorte de if-then-else condensé. Si l'expression en première position est vraie (différente de 0), alors l'expression entière prendra la valeur du deuxième terme. Sinon, ce sera celle du troisième.

    Pour le reste, je te laisse chercher volontairement. Fais une proposition justifiée ici. On te dira si c'est bon ou pas, et pourquoi.

  3. #3
    Membre averti
    Inscrit en
    Février 2010
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 22
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    C'est un exercice scolaire ?

    « … ? … : … » est un opérateur ternaire. Il s'agit d'une sorte de if-then-else condensé. Si l'expression en première position est vraie (différente de 0), alors l'expression entière prendra la valeur du deuxième terme. Sinon, ce sera celle du troisième.
    ca je le sais déja ,mais ce que j'ai pas compris c'est (a--,b++)

    voila ce que moi jai fais


    au début en doit faire a-- et b++ donc a prend 15 et b prend 9

    en suite

    !(a%2) donne vrai et aprés ... je bloke

  4. #4
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    Essaye de mettre l'expression sous la forme if ... else ... et tu verras que tu trouveras la solution tout seul.

  5. #5
    Membre Expert
    Avatar de slim_java
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2008
    Messages
    2 272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2008
    Messages : 2 272
    Par défaut
    salut
    déchiffre ces ligne et tu va trouvé la solution :


    Opérateur virgule

    Syntaxe :
    expression : expression1 , expression2

    Sémantique :
    expression1 est évaluée et sa valeur ignorée. expression2 est évaluée et sa valeur est la valeur de l'expression virgule.


    Opérateur conditionnel

    Syntaxe :
    expression : expression1 ? expression2 : expression3


    Sémantique :
    expression1 est évaluée et doit délivrer une valeur de type entier. Si cette valeur est :

    -
    non nulle, expression2 est évaluée et le résultat est la valeur de l'expression conditionnelle.
    -
    nulle, expression3 est évaluée et le résultat est la valeur de l'expression conditionnelle.

  6. #6
    Membre averti
    Inscrit en
    Février 2010
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 22
    Par défaut
    salut
    merci bcp pour vos réponse
    maintenant j'ai testé ce code sur les pointeurs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
      char *p1 = "Bonjour";
      char *p2 = "Bonjour";
     
    printf("%d &p1",p1);
    printf("\n%d &p2",p2);

    mais j'arrive pas a comprendre pourquoi p2 pointe vers la même adresse que p1 malgré que j'ai pas fait p2 = p1 ?

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Ces deux chaines littérales étant strictement identiques, c'est la même qui est utilisée. Les pointeurs pointent donc tous les deux vers la même chaine. Ceci est d'autant possible que cette chaine pointée par deux pointeurs différents est constante ; il est donc plus raisonnable pour le compilateur de créer une seule chaine au lieu de deux équivalentes.

    Par contre, si tu tapais un code tel que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char const * const p1 = "Bonjour";
    char const * const p2 = "bonjour"; /* première lettre différente */
    Là, ce serait différent, tu aurais bien deux chaines à part entière.

    Avec un code tel que tu l'as écrit, le compilateur devrait toutefois te crier dessus (pas une erreur, mais un warning) pour t'inciter à rajouter des const ; en effet, ces deux chaines littérales sont accessibles uniquement en lecture.

  8. #8
    Membre averti
    Inscrit en
    Février 2010
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 22
    Par défaut
    Citation Envoyé par jeroman Voir le message
    Ces deux chaines littérales étant strictement identiques, c'est la même qui est utilisée. Les pointeurs pointent donc tous les deux vers la même chaine.
    depuis quand le compilateur est assez "intelligent" pour faire de tel traitement" tous seul "!!!! ??

  9. #9
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Il n'y a rien de sorcier. Ce n'est même pas une question d' "intelligence" du compilateur. Il est tout simplement programmé pour.
    Lorsqu'il compile, il effectue des optimisations plus ou moins poussées. S'il constate que deux chaines littérales sont strictement identiques, il n'a aucune raison d'encombrer le fichier de sortie (exécutable ou objet) inutilement.

  10. #10
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 444
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 444
    Par défaut
    Citation Envoyé par Débutant_ASM Voir le message
    depuis quand le compilateur est assez "intelligent" pour faire de tel traitement" tous seul "!!!! ??
    Depuis longtemps. Comme te le dit Jeroman, c'est une question de bon sens.

    Cela dit, tes questions sont parfaitement justifiées et pertinentes. Elles montrent que tu as compris comment cela fonctionne. Il reste que les compilateurs peuvent faire beaucoup mieux. Dans le cas de GCC, par exemple, l'option « -O » permet de préciser le niveau d'optimisation que l'on attend de la part du compilateur. Les compilateurs récents sont d'ailleurs capables de prouesses que l'on n'attendait pas d'eux a priori.

  11. #11
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    Ils sont assez intelligents pour supprimer les conditions qui seront toujours fausses, ou les instructions qui ne servent à rien.
    Si on devait relire le code après compilation je pense qu'on serait très surpris.

  12. #12
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 444
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 444
    Par défaut
    Citation Envoyé par Pouet_forever Voir le message
    Si on devait relire le code après compilation je pense qu'on serait très surpris.
    Si tu ajoutes l'option « -S » en majuscule à GCC, tu pourras le faire…

  13. #13
    Membre averti
    Inscrit en
    Février 2010
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 22
    Par défaut
    salut
    merci pour vos interventions.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      char *p1 = "Bonjour";
      char *p2 = "Bonjour";
    cette optimisation niveau compilation risquera pas d'engendrer des erreurs ?
    par exemple si le programmeur n'as pas été attentif que p1 et p2 pointent vers le méme espace mémoire ,alors une modification de p2 va modifiée le contenu pointé par p1 sans que le programmeur ait conscience . ça été juste un exemple simple avec un petit " Bonjour " mais pour des situations plus complexe sa peut causer beaucoup de problèmes ....!!!

  14. #14
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 391
    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 391
    Par défaut
    Tu n'es pas censé modifier les chaînes pointées. Avec les options normales, sous Windows, ces chaînes sont dans une zone mémoire à lecture seule et tu auras une Access Violation si tu tentes d'y écrire.

    Et si tu utilises gcc, tu peux activer le warning -Wwrite-strings, qui fait considérer les chaînes comme des pointeurs const. Ainsi, tu auras un warning si tu n'écris pas avec const:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      char *p1 = "Bonjour"; /*warning sous gcc avec l'option activée*/
      char const *p2 = "Bonjour"; /*pas de warning.*/
    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.

  15. #15
    Membre averti
    Inscrit en
    Février 2010
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 22
    Par défaut
    salut
    j'ai essayer cette commande sous Ubuntu

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc -Wwrite-strings teste appli2.c
    avec ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <stdio.h>
    #include <stdlib.h>
     
    int main( )
    {
    char *p1 ="bonjour";
      char *p2 ="bonjour";
      *(p2+2) ="c";
      printf("%s",p1);
     
      return EXIT_SUCCESS; // return 0;
    }
    et j'ai obtenu les Warings suivants

    initialization discards qualifiers from pointer target type
    assignement makes integer from pointer without a cast

  16. #16
    Membre chevronné Avatar de Jenna
    Inscrit en
    Décembre 2009
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Décembre 2009
    Messages : 272
    Par défaut
    La ligne qui pose problème est :
    Tu as un pointeur sur caractères dans lequel tu essaie de ranger une chaine de caractères ("c" est une chaine de caractères, pas un caractère) et cela ne passe pas.

    Je pense que tu veux faire quelque chose comme cela
    c'est à dire remplacer le 'n' de "bonjour" par un 'c'.

    Comme indiqué un peu plus haut, tu t'exposes à des désagréments car la chaine "bonjour" n'est pas supposée pourvoir être modifiée (même si dans ton cas, cela semble fonctionner).

    Une bonne méthode serait plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char p2[] ="bonjour";
    *(p2+2) ='c';
    voire même
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char p2[] ="bonjour";
    p2[2] ='c';
    que je trouve plus lisible

  17. #17
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Si tu ajoutes l'option « -S » en majuscule à GCC, tu pourras le faire…
    Oui, mais je ne parlais pas de l'assembleur mais du code C lui-même. (bien que ça ne change pas grand chose)

Discussions similaires

  1. Problèmes avec l'instruction TEST
    Par n5Rzn1D9dC dans le forum x86 16-bits
    Réponses: 6
    Dernier message: 15/07/2013, 12h45
  2. Réponses: 3
    Dernier message: 03/02/2011, 17h40
  3. Explication d'une instruction de test
    Par ToTo13 dans le forum C
    Réponses: 8
    Dernier message: 07/02/2007, 17h02
  4. A quoi sert l'instruction test eax,eax ?
    Par microseb dans le forum x86 32-bits / 64-bits
    Réponses: 4
    Dernier message: 25/01/2005, 21h12
  5. test collisions
    Par tatakinawa dans le forum OpenGL
    Réponses: 5
    Dernier message: 08/06/2002, 06h03

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