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 :

Au sujet de l'utilisation explicite true dans les expressions booléennes


Sujet :

C++

  1. #21
    Membre éprouvé
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 552
    Points : 1 060
    Points
    1 060
    Par défaut
    Bonsoir,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if <expression-booleenne>
    Pour la comparaison à true, quand je lis deux "experts confirmés senior" ayant chacun une opinion opposée : Je me dis que ce sont des guerres de chapelle...

    Pour ma part, ma principale source de bug immédiat (i.e. avant tests), c'est l'inversion de logique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if ( estBon ){
         //je traite pas bon
    }else{
         // je traite bon
    }
    Dans les deux cas (estBon) ou (estBon == true), je la ferai toujours quand je somnole... Voir l'inverse dans des conventions de codage ne me ferait pas poser ma démission, mais je rejoins Luc sur un point : Il y a d'autres guerres plus utiles (les noms parlants, limiter la conditionnelle, les imbrications, etc.)

    Dommage qu'ils soient écrit si petit les PS d'Emmanuel Deloget à propos des tests de pointeurs null. Par un moment, pour des questions de refactoring (*) vers des smart pointers justement, j'ai rêvé d'un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    /* !!!n'existe pas!!! */
    if ( std::is_null( pointeur ) ){
     
    }
    ... avec un comportement homogène sur tout ce qui a sémantique de pointeur (auto_ptr, shared_ptr, etc.)...

    A mon avis, le vrai problème n'est pas qu'on test si le pointeur est 0 ou NULL, mais que dans le fond, qu'on ne fasse pas abstraction du fait qu'un pointeur a pour valeur une adresse (d'où les soucis quand les pointeurs sont encapsulés et qu'on doit les dés-encapsuler à coup de get).

    Mais bon, on a d'autres problèmes dans la vie!

  2. #22
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par cob59 Voir le message
    Roh mais ne le prend pas comme ça.
    Après, le fait de tronquer ==0 et ==nullptr pour garantir la généricité me fait doucement rire ( <-- là oui, cette fois je suis ouvertement méprisant).
    Oui mais ça ne devrait pas : dès lors que x possède une conversion, même implicite, vers bool, if les possible d'écrire "if (x)". Ces écritures deviennent par exemple possible :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      if (stream) // stream est d'un type std::stream quelconque
      if (ptr) // ptr est du type std::unique_ptr<>
      if (my_object) // my_object possède un opérateur de 
                     // conversion implicite vers un type convertible vers bool
                     // ou un operateur explicit bool() en C++11
    Alors qu'on a vite des problèmes avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      if (stream == ????) // qu'est-ce que je mets là ?
      if (my_object == ????) // en C++11, je peux écrire "true" à la place de ????, mais
                             // en C++98, ça risque d'être compliqué: le type réel renvoyé risque 
                             // fort d'être un pointeur sur une fonction membre ; du coup, il faudrait
                             // tester contre NULL ou nullptr, ce qui n'a pas vraiment de sens.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  3. #23
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 626
    Points : 30 684
    Points
    30 684
    Par défaut
    Je voudrais quand même préciser une petite chose

    Je suis le premier à ne pas forcément expliciter == true lorsque je dispose d'une expression connue pour être un booléen suffisamment explicite pour me permettre de savoir ce qui est effectivement testé.

    Le code if (truc.loadFile("fichier.txt") ) ne me gène absolument pas

    Par contre, je trouve que le fait de dire
    Il ne faut pas préciser == true
    est aussi dangereux que le fait de vouloir forcer l'utilisation de cette forme!

    Surtout si cette phrase n'est pas argumentée.

    Qu'il suffise de voir les réactions aux arguments que j'ai donné et qui tiennent pourtant la route (meme si je n'y souscrit pas forcément) pour se rendre compte à quel point il est difficile de trouver un consensus sur la chose !!!

    Ce que je voulais mettre en évidence, c'est qu'il n'y a aucune raison à être catégorique ni dans un sens, ni dans l'autre : après tout, comme je l'ai fait remarquer, le fait d'écrire == true ne prend qu'une demi seconde et n'use pas forcément le clavier

    Par contre, lorsque quelqu'un débute (comprenez : avant qu'il ne se soit habitué au fait que le == true soit implicite ) il me semble réellement exagéré d'essayer de lui interdire cette écriture!

    Il y a en effet neuf chances sur dix pour qu'un débutant trouve plus explicite de l'ajouter dans ses premiers codes mais pour qu'il s'habitue, après avoir pris un peu de bouteille, à passer à la forme implicite, c'est dans la courbe d'apprentissage!

    Ce qui m'a fait hurler à la base n'est pas tant en le fait que bretus ait fait la remarque, mais bien qu'il l'ait faite sans apporter de justifications, et donc, même si sa remarque était correcte et non agressive, qu'il donnait l'impression de faire une remarque arbitraire de "tu ne dois jamais ajouter == true".

    C'est d'autant plus vrai que, à voir la demande originale, gregg1 est tout en bas de la courbe d'apprentissage et que la particularité qui consiste à considérer == true comme implicite ne doit etre exprimée que bien après (et l'on se comprend sur le terme, hein ) qu'il ait assimilé la différence entre la comparaison et l'affectation
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #24
    Membre éprouvé

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Points : 1 086
    Points
    1 086
    Par défaut
    Citation Envoyé par Emmanuel Deloget Voir le message
    Oui mais ça ne devrait pas : dès lors que x possède une conversion, même implicite, vers bool, if les possible d'écrire "if (x)". Ces écritures deviennent par exemple possible :
    En c++, il y a toujours une marge entre ce qu'il est possible de faire et ce qu'il est recommandé de faire. Appeler une méthode booléenne (du genre isEmpty()) sur un objet sera toujours préférable à une conversion implicite vers un bool, en terme de clarté du code. Donc selon tes exemples :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (stream.good())
    if (ptr!=nullptr)
    if (object.isValid())
     
    // C'est tout de suite plus lisible, non ?
    Sur l'argument de la généricité, j'ai du mal à m'imaginer quel serait le «rôle algorithmique» du if dans le code suivant, avec des types T très disparates (string, map, int, void*, ...). Qu'attend-on du if de la fonction foo<T> ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    template <class T>
    void foo(const T& v)
    {
      if (v) {
        ...
      }
    }

  5. #25
    screetch
    Invité(e)
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Le code if (truc.loadFile("fichier.txt") ) ne me gène absolument pas
    loadFile() retourne en fait non pas un booleen qui indique le succès mais un code d'erreur. Ton code if devient inversé.

  6. #26
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Citation Envoyé par Emmanuel Deloget Voir le message
    Oui mais ça ne devrait pas : dès lors que x possède une conversion, même implicite, vers bool, if les possible d'écrire "if (x)". Ces écritures deviennent par exemple possible
    C'est ça qui ne devrait pas être fait : reposer sur une conversion implicite (une habitude du C).

    Du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int i = 10;
    while (i)
    {
       i--
    }
    Il vaut mieux faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int i = 10;
    while (i > 0)
    {
       i--
    }

  7. #27
    screetch
    Invité(e)
    Par défaut
    ca ne devrait pas, il faut, ce n'est pas très argumenté (c'est pas forcément une critique, surtout un constat) comme la plupart des posts précédents. Bref, tout le monde il a raison, c'est une question de préférence, les coups et les douleurs ca se discute pas.

    et sinon, ce qui est dommage/pas sympa c'est surtout d'essayer de convaincre, je dirai plutôt convertir vu la tournure religieuse que prend la conversation.

  8. #28
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Les arguments sont données dans mon premier post sur ce sujet.

  9. #29
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par Emmanuel Deloget Voir le message
    PS1 : si tu me trouve un peu "dur", il faut mettre en rapport les termes "idiotismes" et "utilisés par les idiots", et comme je l'utilise beaucoup...
    Je ne vois absolument pas pourquoi les mettre en rapport. Ce sont deux mots qui n'ont pas grand'chose à voir l'un avec l'autre, et idiotisme n'est absolument pas connoté péjorativement, la racine "idio" venant juste du mot idiome.

    Citation Envoyé par cob59 Voir le message
    En c++, il y a toujours une marge entre ce qu'il est possible de faire et ce qu'il est recommandé de faire. Appeler une méthode booléenne (du genre isEmpty()) sur un objet sera toujours préférable à une conversion implicite vers un bool, en terme de clarté du code. Donc selon tes exemples :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (stream.good())
    if (ptr!=nullptr)
    if (object.isValid())
     
    // C'est tout de suite plus lisible, non ?
    Je ne suis pas certain que ce soit le cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while(stream >> nom >> prenom >> age);
    // ou
    while((stream >> nom >> prenom >> age).good());
    Je trouve la seconde écriture bien moins claire, avec des parenthèses qui rendent difficile de voir à quoi est appliqué la fonction good.

    Sinon, je vais systématiquement expliciter la constante pour un type entier (ne serait-ce que parce que dans la moitié du code, une valeur 0 signifie ok, et une valeur non nulle représente un code d'erreur, et dans l'autre moitié du code, l'entier est à considéré comme un booléen qui s'ignore, avec 0 valant false, tout le reste valant true).

    Pour un booléen, je ne vais jamais expliciter la constante, je trouve que ça alourdi inutilement, surtout quand l'expression se complexifie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if (a || (b && c))
    if (a==true || (b && c))
    if (a || (b==true && c))
    if (a || (b&& c==true))
    if (a==true || (b && c==true))
    if (a==true || (b==true && c==true))
    if ((a==true || (b==true && c==true)==true)==true)
    Pour un pointeur, j'oscille... Au début, je mettais des ==NULL (que je rêvais de remplacer par des ==nullptr). Mais comme cette écriture ne marche pas bien avec des shared_ptr, je me suis habitué à ne mettre que le pointeur.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  10. #30
    Membre éprouvé

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Points : 1 086
    Points
    1 086
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    // Notation abrégée
    while(stream >> nom >> prenom >> age) {
    }
    // Notation explicite
    while(stream.good()) {
        stream >> nom >> prenom >> age;
    }

  11. #31
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 279
    Points : 11 011
    Points
    11 011
    Par défaut
    Et tu boucles deux fois sur la dernière ligne. (on en parle dans la FAQ).

    @Loic, je te pique ton exemple, je l'adore.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  12. #32
    Membre éprouvé Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Points : 997
    Points
    997
    Par défaut
    Citation Envoyé par Luc Hermitte Voir le message
    Et tu boucles deux fois sur la dernière ligne. (on en parle dans la FAQ).
    Euh, j'ai reparcouru rapidement le section de la FAQ sur les flux, mais je n'ai rien vu concernant ce double bouclage.
    Peux-tu développer, s'il-te-plaît ?

  13. #33
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 279
    Points : 11 011
    Points
    11 011
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  14. #34
    Membre éprouvé Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Points : 997
    Points
    997
    Par défaut
    Ah ok, je pensais que tu parlais de la dernière ligne de code...
    Au temps pour moi...

Discussions similaires

  1. Utiliser des variables dans les noms d'objet
    Par Torkan dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 15/03/2007, 23h54
  2. Réponses: 1
    Dernier message: 05/10/2006, 14h31
  3. utilisation des sessions dans les jsp
    Par casho dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 16/08/2006, 19h45
  4. [MySQL] Utilisation du caractère "`" dans les requêtes
    Par PeZ dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 07/03/2006, 16h01

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