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 :

Opérateurs et expressions


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2008
    Messages : 24
    Par défaut Opérateurs et expressions
    Bonjour à tous !

    Je suis un ptit nouveau dans la programmation et j'ai décidé de me mettre au C

    Je sollicite un peu votre aide car dès le premier exercice d'un bouquin, j'ai du mal a comprendre ceci :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    int main(int argc, char *argv[])
    {
    	int n=10, p=5, q=10, r ;
     
    	r = n == (p = q);
    	printf("A : n = %d, p = %d, q = %d, r = %d\n", n, p, q, r);
     
    	n = p = q = 5;
    	n += p += q;
    	printf("B : n = %d, p = %d, q = %d\n", n, p, q);
     
    	q = n < p ? n++ : p++;
    	printf("C : n = %d, p = %d, q = %d\n", n, p, q);
     
    	q = n > p ? n++ : p++;
    	printf("D : n = %d, p = %d, q = %d\n", n, p, q);
    }

    Quelqu'un aurait-il la gentillesse de me commenter les résultats svp

    Je vous remercie beaucoup d'avance de votre aide précieuse car j'en ai bien besoin

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    C'est quoi ce bouquin ?

    "Comment apprendre les formes les plus tordues du C et rendre son code illisible pour les autres ?". Il est vendu avec un tube d'aspirine ?

    En ce qui concerne ce genre de forme :
    Je préfère largement un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    n = 5;
    p = 5;
    q = 5;
    qui a le mérite d'être explicite et pas prise de tête.

    Si c'est en pensant écrire un code plus rapide, autant laisser l'optimiseur du compilateur faire son boulot, dans la très grande majporité des cas, il fera mieux que l'humain.

    Donc en gros, je déconseille ce genre d'écriture (et donc de lecture)
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre expérimenté
    Homme Profil pro
    Ingénierie des systemes embarqués temps réels
    Inscrit en
    Juin 2006
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Ingénierie des systemes embarqués temps réels
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2006
    Messages : 152
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    C'est quoi ce bouquin ?

    "Comment apprendre les formes les plus tordues du C et rendre son code illisible pour les autres ?". Il est vendu avec un tube d'aspirine ?
    Il y a encore de profs enseigne les methodes pour remporter la palme de International Obfuscated C Code Contest

  4. #4
    Membre expérimenté
    Homme Profil pro
    Ingénierie des systemes embarqués temps réels
    Inscrit en
    Juin 2006
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Ingénierie des systemes embarqués temps réels
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2006
    Messages : 152
    Par défaut
    Citation Envoyé par fouedou77 Voir le message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    int main(int argc, char *argv[])
    {
    	int n=10, p=5, q=10, r ;
    	
    	r = n == (p = q); 
    p reçoit la valeur de q :10    si la valeur de n=valeur de p et q , n recoit vrai (1)
    	printf("A : n = %d, p = %d, q = %d, r = %d\n", n, p, q, r);
      
    
    	n = p = q = 5;
    	n += p += q;
    lecture de la droite vers la gauche : p=p+q (5+5)  n=p+n  (10+5)
    	printf("B : n = %d, p = %d, q = %d\n", n, p, q);
    
    ici n=15 p=10 q=5  d'apres ce qui précède 
    	q = n < p ? n++ : p++;
    
    si n<p alors q= n puis incrementation n  de 1 sinon q=p et ....
        or n=15 > p=10 donc q=p puis on increment p
    	printf("C : n = %d, p = %d, q = %d\n", n, p, q);
    meme genrede reflexion
    	q = n > p ? n++ : p++;
    	printf("D : n = %d, p = %d, q = %d\n", n, p, q);
    }

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    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 397
    Par défaut
    J'ai la flemme de compiler le programme, donc ça va être du théorique (comme ça, si j'ai faux, il y aura une différence avec les résultats affichés).

    Première expression:
    Compte tenu des priorités, ça doit s'évaluer comme ça:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    p = q;
    r = (n == p);
    En clair, la valeur de q (10) est copiée dans p, puis p (10) et n (10) sont comparés. Comme ils sont égaux, r vaudra 1.
    {n, p, q, r} = { 10, 10, 10, 1 }

    Seconde expression:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	n = p = q = 5;
    	n += p += q;
    Les opérateurs d'affectation et d'affectation-opération s'évaluant de droite à gauche, ça donne ceci:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    q = 5;  //q <- 5
    p = q;  //p <- 5
    n = p;  //n <- 5
    p += q; //p <- 5+5 = 10
    n += p; //n <- 5+10 = 15
    En clair, les variables sont toutes les trois initialisées à 5, puis on ajoute q (5) à p (5) qui vaudra donc (10), avant d'ajouter p (10) à n (5) qui vaudra donc 15.
    {n, p, q} = { 15, 10, 5 }

    Troisième expression:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    q = n < p ? n++ : p++;
    Avec les opérateurs ternaires et la post-incrémentation, cette ligne donne ceci:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if(n < p) //faux, puisque n = 15 et p = 10
    {
    	q = n; //ne sera pas exécuté
    	n++;
    }
    else
    {
    	q = p; //q <- 10
    	p++;  //p <- 11
    }
    On compare, puis on affecte, puis on incrémente.
    {n, p, q} = { 15, 11, 10 }

    Quatrième expression:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    q = n > p ? n++ : p++;
    Qui donne ceci:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if(n > p) //vrai, puisque n = 15 et p = 11
    {
    	q = n; //q <- 15
    	n++;   //n <- 16
    }
    else
    {
    	q = p; //ne sera pas exécuté
    	p++;
    }
    On compare, puis on affecte, puis on incrémente.
    {n, p, q} = { 16, 11, 15 }
    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
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    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 397
    Par défaut
    ram-0000: C'est un exercice de lecture, la difficulté est donc sans doute tout l'intéret de l'exercice.
    D'un côté il entraîne à la lecture de code difficile, de l'autre il montre qu'un tel code est difficile à lire, et donc à éviter.
    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.

  7. #7
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    ram-0000: C'est un exercice de lecture, la difficulté est donc sans doute tout l'intéret de l'exercice.
    D'un côté il entraîne à la lecture de code difficile, de l'autre il montre qu'un tel code est difficile à lire, et donc à éviter.
    Mouais ... allez, je vote pour l'aspect éducatif du genre de code qu'il ne faut pas écrire
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2008
    Messages : 24
    Par défaut
    Eh bien je vous remercie en tout cas, c'est déjà bien plus clair

Discussions similaires

  1. Réponses: 7
    Dernier message: 20/11/2008, 10h58
  2. [SSRS][2k5]Expression Opérateur LIKE
    Par thinker dans le forum SSRS
    Réponses: 3
    Dernier message: 09/09/2008, 13h14
  3. [ODBC] Erreur de syntaxe (opérateur absent) dans l'expression
    Par nawak.seb dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 25/08/2008, 14h53
  4. Expression variable avec opérateur booléen
    Par greg778 dans le forum Langage
    Réponses: 3
    Dernier message: 13/09/2007, 14h39

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