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 :

pb lors d'un if( xxx && xxx && xxx)


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 277
    Par défaut pb lors d'un if( xxx && xxx && xxx)
    hello,

    C'est assez curieux mais dans mon code j'utilise:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                if( (*(pt1++) == 0) && (*(pt2++) == 0) && (*(pt3++) == 0))
                {
                    if( (*(pt1++) == 0) && (*(pt2++) == 0) && (*(pt3++) == 0))
                    {
                        if( (*(pt1) == 0) && (*(pt2) == 0) && (*(pt3) == 0))
    le compilateur lit la première instruction *(pt1++) et si ce n'est pas égale a zéro il passe directement au else sans incrémenter ptr2 et ptr3, par contre ptr1 lui est incrémenté.

    J'aimerais vraiment faire tout les ++ d'un bloc, est ce qu'il existe une syntaxe particulière à adopter??

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Il faut que la condition soit vraie pour qu'il passe à la suivante. Essaye avec || au lieu de &&
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  3. #3
    Membre Expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 887
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 887
    Par défaut
    Ce comportement est normal, c'est une optimisation de la condition ( en effet, si ta condition est composée exclusivement de clauses "ET", et que le premier test est faux, les autres tests ne sont pas effectués )

    Si tu as besoin de faire toutes tes incrémentations avant tes tests, il faut donc tout simplement incrémenter avant de tester :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    pt1++;
    pt2++;
    pt3++;
    if(
         (*pt1 == 0) 
      && (*pt2 == 0) 
      && (*pt3 == 0)
      )

  4. #4
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    c'est normal, ça vient de l'opérateur && qui n'exécute pas le terme droit si le gauche vaut false (de même que || n'évalue pas le droit si le gauche vaut true)

    que penses-tu de ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int a1 = *pt1++;
    int a2 = *pt2++;
    int a3 = *pt3++;
     
    if(a1 == 0 && a2 == 0 && a3 == 0)
    {
       a1 = *pt1++;
       a2 = *pt2++;
       a3 = *pt3++;
       if(a1 == 0 && a2 == 0 && a3 == 0)
       {
          if(*pt1 == 0 && *pt2 == 0 && *pt3 == 0)
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 277
    Par défaut
    ok merci

    j'ai réussi

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 277
    Par défaut
    ok merci

    j'ai réussi

  7. #7
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Swoög
    c'est normal, ça vient de l'opérateur && qui n'exécute pas le terme droit si le gauche vaut false (de même que || n'évalue pas le droit si le gauche vaut true)

    que penses-tu de ceci :
    Voilà du code qui me parait beaucoup plus clair... Adopté.

  8. #8
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    C'est serieux ces histoires de niveau? ^^

  9. #9
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Pour les niveaux je sais pas, mais gourou ca existe, dans une annonce Java j'ai vu une fois Recherche gourou Java

    Emmanuel tu te situes gourou niveau combien ??

  10. #10
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Skyrunner
    Pour les niveaux je sais pas, mais gourou ca existe, dans une annonce Java j'ai vu une fois Recherche gourou Java

    Emmanuel tu te situes gourou niveau combien ??
    -10

  11. #11
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par gronaze
    C'est assez curieux mais dans mon code j'utilise:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                if( (*(pt1++) == 0) && (*(pt2++) == 0) &&
    Je déconseille formellement de mélanger les opération unaires comme ++, -- += etc et les expresson. Trop de risques de cas indéfinis (absence de points de séquences et autres joyeuseté).

    Seul un gourou de niveau 4 ou 5 (sur les 5 niveaux connus à ce jour) pourrait affirmer que cette expression est conforme ou non.

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

Discussions similaires

  1. Comment eviter le changement de & en &amps lors d'une transformation?
    Par hutuchong dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 10/12/2009, 18h17

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