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 :

Transformer deux if en un seul :


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 607
    Par défaut Transformer deux if en un seul :
    Bonjour

    Je pense que c'est possible, mais je demande confirmation et explication. Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (root->texte>texte) if (root->content[texte].item==(texte+fils+com))
    Je dois faire le premier test afin de m'assurer que la structure root->content[texte] existe afin de ne pas faire appel à une structure qui n'existe pas et générer une erreur.

    je penserais à quelque chose de la forme suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (root->texte>texte , root->content[texte].item==(texte+fils+com))
    Mais, je n'ai jamais utilisé la virgule. Donc je demande confirmation et une petite explication.
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    L'opérateur && suffit.

    Exemple :

    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
    #include <stdio.h>
    int retourneFaux(void) {
        printf("retourne Faux appele\n");
        return 0;
    }
     
    int retourneVrai(void) {
        printf("retourne Vrai appele\n");
        return 1;
    }
     
    int main(void) {
       if(retourneFaux() && retourneVrai()) {
           printf("premier test vrai\n");
       } else {
           printf("premier test faux\n");
       }
       if(retourneVrai() || retourneFaux()) {
           printf("second test vrai\n");
       } else {
           printf("second test faux\n");
       }
        return 0;
    }
    retourne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    retourne Faux appele
    premier test faux
    retourne Vrai appele
    second test vrai
    EDIT :
    Mais, je n'ai jamais utilisé la virgule. Donc je demande confirmation et une petite explication.
    La virgule va avoir le comportement inverse à ce que tu attends :

    soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int a();
    int b();
    int i = a(), b();
    La ligne écrite aura le comportement suivant :
    1. appel de a()
    2. écriture de la valeur retournée par a() dans i
    3. appel de b()

    soit : La ligne écrite aura le comportement suivant :
    1. appel de a()
    2. appel de b()
    3. écriture de la valeur retournée par b() dans i

  3. #3
    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
    Pour ce qui est de l'opérateur virgule, les expressions sont évaluées de gauche à droite et la valeur retournée est celle de l'expression la plus à droite.
    Il faut aussi noter que dans cet exemple:
    Citation Envoyé par mabu Voir le message
    La virgule va avoir le comportement inverse à ce que tu attends :

    soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int a();
    int b();
    int i = a(), b();
    La ligne écrite aura le comportement suivant :
    1. appel de a()
    2. écriture de la valeur retournée par a() dans i
    3. appel de b()
    La virgule joue le rôle d'un simple séparateur b() ne sera jamais appelée c'est une déclaration redondante et non un appel de fonction.

    Dans le deuxième exemple par contre la virgule joue le rôle d'un opérateur (forcé par les deux parenthèses).

  4. #4
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 607
    Par défaut
    OK !
    Donc, j'avais entièrement tord ! La virgule est surprenante !

    Dans un test et : si le premier est faux, alors pas besoin d'aller plus loin et le C ne va pas plus loin pour savoir que c'est faux;
    Dans un test ou, si le premier est vrai, alors pas d'aller plus loin et le C ne va pas plus loin pour savoir que c'est vrai.
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  5. #5
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par troumad Voir le message
    Dans un test et : si le premier est faux, alors pas besoin d'aller plus loin et le C ne va pas plus loin pour savoir que c'est faux;
    Dans un test ou, si le premier est vrai, alors pas d'aller plus loin et le C ne va pas plus loin pour savoir que c'est vrai.
    Tout à fait, mais ça ne se limite pas à deux tests.

  6. #6
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 607
    Par défaut
    Et ceci quelque soit le compilateur ? C'est dans les spécifications du C ?
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

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

Discussions similaires

  1. [XSLT] Transformer deux fichiers XML avec un seul Stylesheet
    Par sylvie dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 26/08/2010, 14h23
  2. [VB6] "Concaténation" de deux images en une seule
    Par KrusK dans le forum VB 6 et antérieur
    Réponses: 22
    Dernier message: 07/07/2006, 09h45
  3. Transformer logiquement deux HDD en un seul
    Par yoyopi dans le forum Composants
    Réponses: 8
    Dernier message: 17/02/2006, 11h28
  4. enregistrer deux fichier dans un seul fichier
    Par Bourak dans le forum Langage
    Réponses: 9
    Dernier message: 05/11/2005, 09h48
  5. [VB6]Joindre deux recordsets en un seul
    Par elifqaoui dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 11/06/2003, 21h06

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