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 :

une virgule dans un if


Sujet :

C

  1. #1
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    859
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 859
    Points : 714
    Points
    714
    Par défaut une virgule dans un if
    Bonjour

    j'ai trouvé ce code qui compile:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void test (long long d) 
    { 
      int b = 7;
      if (b==7, 1)
      {
        b = 8;
      }
    }
    et j'avoue ne pas comprendre le but de la virgule dans le test.

    Bonne journée
    Si tu ne vis pas ce que tu penses alors tu penses ce que tu vis.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    La virgule est en réalité un opérateur elle permet d'évaluer 1 par 1 des expressions, de gauche à droite (<- par contre je ne sais plus si le sens est spécifié dans la norme ou c'est dépendent du compilateur)
    Mais surtout, il retournera toujours le résultat de la dernière expression.
    Il faut penser à la boucle for, pour l'enchaînement des initialisations et/ ou des pas (si plus de 2 sont nécessaire)

    Donc ici tu as 2 expressions b==7 et 1 et elle retourne la valeur 1 donc ta condition sera toujours vrai.

    D'ailleurs mon compilateur gcc semble assez malin pour détecter la tautologie : main.c:XXX.XXX: warning: l'opérande à gauche de la virgule n'a pas d'effet [-Wunused-value]

    Tu peux tester ces codes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        int b = 4;
        if (b ==7, 1) { b = 8; }
     
        printf("b: %d\n", b);
    Résultat : b: 8

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        int b = 4;
        if (b ==7, 0) { b = 8; }
     
        printf("b: %d\n", b);
    Résultat : b: 4

  3. #3
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    859
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 859
    Points : 714
    Points
    714
    Par défaut
    Merci M'sieur !
    Si tu ne vis pas ce que tu penses alors tu penses ce que tu vis.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Il y a la page wiki en anglais qui permet de signaler plusieurs choses :
    • Pour le passage de paramètres ce n'est pas l'opérateur. Donc des fois c'est l'opérateur, des fois non
    • On peut mettre dans l'expression qui n'est pas la + à droite, tout ce qui peut être pertinent comme des chaînes de caractères, des affectations ou un appel de fonction pour ensuite tester son retour.
    • On ne peut pas assigner le retour
    • La précédence la + faible

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par foetus Voir le message
    (<- par contre je ne sais plus si le sens est spécifié dans la norme ou c'est dépendent du compilateur)
    C'est l'opérateur séquentiel. De fait, vu son nom, il y a fort à parier que le sens d'évaluation sera toujours de la gauche vers la droite. C'est d'ailleurs en général ce que disent la majorité des docs et tutos C et c'est aussi décrit ainsi dans cette doc développez.

    Citation Envoyé par foetus Voir le message
    Oui enfin tous les exemples de cette page sont quand-même des exemples bien foireux, presque écris "exprès" pour intégrer une virgule là où on n'en a pas besoin. Parce que partout où la virgule est mise on peut écrire la même chose sans. Ca fait bien longtemps qu'on sait que c'est pas difficile d'écrire du code dégueu en C
    Le seul moment où la virgule est vraiment incontournable c'est quand on veut faire évoluer plusieurs variables en parallèle dans un for (i.e for (i=0, j=15; i < 10; i++, j+=2)).

    Citation Envoyé par foetus Voir le message
    On peut mettre dans l'expression qui n'est pas la + à droite, tout ce qui peut être pertinent comme des chaînes de caractères, des affectations
    Ou alors on met tout ça dans une autre instruction

    Citation Envoyé par foetus Voir le message
    ou un appel de fonction pour ensuite tester son retour.
    Ca j'ai pas vu où c'était dans la page. Mais si c'est un truc style if (x=fct(), x != 0) (ce qui là encore laisse supposer une évaluation nécessairement allant de la gauche vers la droite) alors je préfère encore la version habituelle if ((x=fct()) != 0).
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

Discussions similaires

  1. [Débutant] [VS2003] Point à la place d'une virgule dans une String
    Par ahmedige dans le forum VB.NET
    Réponses: 1
    Dernier message: 19/07/2011, 15h17
  2. Réponses: 6
    Dernier message: 06/01/2010, 14h48
  3. [PROC] Remplacer un point par une virgule dans une Proc Tabulate
    Par PAULOM dans le forum SAS Base
    Réponses: 2
    Dernier message: 20/08/2009, 08h36
  4. Réponses: 3
    Dernier message: 13/03/2009, 15h20
  5. trouver une virgule dans un champ texte
    Par marcuswillbe dans le forum Formules
    Réponses: 1
    Dernier message: 18/01/2009, 17h08

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