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érateur if ternaire


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Inscrit en
    Août 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 7
    Par défaut opérateur if ternaire
    Bonjour à tous.

    J'aurais besoin d'un petit coup de main pour comprendre ce que fait ce test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int z,x,y;
    z = (x&1?0:1) + (y&1?0:2);
    Serait-il possible d'avoir une petite traduction en langage courant, afin que je puisse le traduire en ... Pascal ... et oui, personne n'est parfait ^^

    merci d'avance!

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    En meilleur C++ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int z = 0;
    if (!(x & 1)) // ou encore (x % 2)
        z += 1;
    if (!(y & 1)) // ou encore (y % 2)
        z += 2;
    En langage humain :
    z est composé de deux bits : le premier vaut 1 si x est pair, le second vaut 1 si y est pair.

  3. #3
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    Salut,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int z, x, y; // Attention, tes variables ne sont pas initialisées
     
    if(x & 1) // masque sur le bit de poids faible de l'octet de poids faible de x
        // Le bit est à 1
    else
        // Le bit est à 0
        z += 1;
     
    if(y & 1) // masque sur le bit de poids faible de l'octet de poids faible de y
        // Le bit est à 1
    else
        // Le bit est à 0
        z += 2;
    test ? action/valeur si true : action/valeur si false est une notation abrégée d'un if.
    Pas forcément très lisible.

  4. #4
    Nouveau membre du Club
    Inscrit en
    Août 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 7
    Par défaut
    ok merci !!

  5. #5
    Nouveau membre du Club
    Inscrit en
    Août 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 7
    Par défaut
    ouch !
    en fait, un peu plus loin, toujours dans le même code écrit par une personne qui apparemment avait pas envi d'être relue, on peut lire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    unsigned char *output,input;
    char *ptr = (char*)input;
    int z;
     
    output[i+z] = (x&1)? ptr[x>>1]:ptr[(w>>1)+(x>>1)];
    ce coup ci, c'est plus sur le " >> " que je bloque

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    >> est un décalage de bits vers la droite.
    >> 1 est donc un décalage de 1 bit, ou dit autrement, une division par deux.

  7. #7
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 940
    Par défaut
    Opérateurs de décalage à gauche (<<) et de décalage à droite (>>).

    Exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    byte b = 9; // en binaire : 00001001
    b = b << 1; // == décaler les bits de 1 rang vers la gauche => 00010010
    // b == 18
    b = b >> 3; // == décaler les bits de 3 rangs vers la droite => 00000010
    // b == 2
    Note : chaque rang de décalage vers la gauche équivaut à doubler le nombre, et chaque rang de décalage vers la droite équivaut à diviser par 2 (arondi à l'inférieur), puisqu'on est en base 2 ( base 10 se serait des multiplications/divisions par 10).

    Ici:

    Si x est impair:
    mettre dans output[i+z] le caractère de ptr[] (ou de input) situé à x/2;
    sinon:
    mettre dans output[i+z] le caractète de ptr situé à (w/2)+(x/2)

    'tin, difficile de faire moins clair, qui c'est qui s'est amusé à faire un truc pareil ? Tu fais quoi comme boulot, de la maintenance applicative ? Dire que depuis un moment je n'arrête pas de lire et entendre dire partout qu'il est important de faire un code facile à lire et à reprendre, quitte à ce que ce soit aux dépend de ce genre de soit-disant optimisations...

    Bon courage, le type qui est passé avant toi a l'air d'être un grand communicant...

  8. #8
    Nouveau membre du Club
    Inscrit en
    Août 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 7
    Par défaut
    nan, je tente de faire marcher une dll écrite en C++ sous delphi. Seulement là ou je bosse (en stage) ils ont des pc tellement bien que j'arrive pas à ouvrir une dll, du coup je la traduit en pascal et j'en fait une fiche de mon projet :/

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    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 392
    Par défaut
    Dans ce code, j'aurais utilisé "|" (Opérateur OU bit-à-bit) plutôt que "+" (Addition)...
    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.

  10. #10
    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 : 50
    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
    Par défaut
    Citation Envoyé par spoutspout Voir le message
    test ? action/valeur si true : action/valeur si false est une notation abrégée d'un if.
    Pas forcément très lisible.
    Il y a plein de cas où cette notation est plus lisible qu'un if. Pour moi, l'obfuscation dans le code initial vient plutôt que l'utilisation des & ou des >>1
    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.

  11. #11
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Il y a plein de cas où cette notation est plus lisible qu'un if.
    Tout dépend de ce que tu entends par "lisible".
    Pour moi, un code utilisant ce genre de notation ne fait qu'en obscurcir la compréhension. Car tout le monde ne l'utilise pas (la preuve ici) et elle fait abstraction de plusieurs mots clés du C++ (if, else) qui sont plus parlants qu'une série de '?' et de ':' pour quelqu'un qui se plonge dans ton code.

    Maintenant, pour un gain de temps de codage (~flemme ?), si on est et sera le seul à bosser sur un code, je ne suis pas contre l'utiliser car on sait ce que c'est. Sauf que l'on est jamais rarement tout seul sur un projet (pour le développement autant que pour le MCO).

  12. #12
    Membre émérite Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Par défaut
    Citation Envoyé par spoutspout Voir le message
    Tout dépend de ce que tu entends par "lisible".
    Pour moi, un code utilisant ce genre de notation ne fait qu'en obscurcir la compréhension. Car tout le monde ne l'utilise pas (la preuve ici) et elle fait abstraction de plusieurs mots clés du C++ (if, else) qui sont plus parlants qu'une série de '?' et de ':' pour quelqu'un qui se plonge dans ton code.

    Maintenant, pour un gain de temps de codage (~flemme ?), si on est et sera le seul à bosser sur un code, je ne suis pas contre l'utiliser car on sait ce que c'est. Sauf que l'on est jamais rarement tout seul sur un projet (pour le développement autant que pour le MCO).
    Ben un des defauts du if-else du C/C++, c'est que ce n'est pas une fonction, alors que dans les langages fonctionnels si.

    Tu ne peux pas dire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int offset = if (bHasNormals) { 6; } else { 3; }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int offset;
    if (bHasNormals)
        offset = 6;
    else
        offset = 3;
    Super, vive les effets de bords, et c'est maladroit.
    Dans certains cas, tu peux te payer une construction par défaut chère.

    Là moi j'écris et c'est aussi lisible.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int offset = bHasNormals
               ? 6
               : 3;

  13. #13
    Membre Expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Par défaut
    Il y a un cas où il m'arrive d'être contraint d'utiliser cette notation : dans les listes d'initialization où il y a des constantes à initializer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class Thing
    {
       const int m_machin;
    public:
    Thing( const Bidule& bidule )
        : m_machin( bidule.hasMachin() ?  bidule.getMachin() : -1 )
    {
    }
    (exemple a l'arrache evidemment)

    Ca reste plutot rare mais quand en concevant des systemes avec un maximum de consts, je tombe parfois sur ce genre de cas.

    edit> En fait c'est pareil pour tout ce qui est initialization conditionnelle de constantes...

  14. #14
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    La plus part des règles de codage que j'ai vues dans les boîtes interdisent/découragent l'utilisation du ?: et demandent explicitement le if(){}else(){}.

  15. #15
    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 : 50
    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
    Par défaut
    Et je crois que je refuserait de travailler dans une telle boîte. Il y a de nombreux cas où ?: améliore la lisibilité. Ca ne fait pas la même chose qu'un if. Il y a des cas où un if est plus clair, d'autres où un ?: est plus clair, d'autres cas plus nuancés.
    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.

  16. #16
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Il y a des cas où un if est plus clair, d'autres où un ?: est plus clair, d'autres cas plus nuancés.
    Ok pour ça .

  17. #17
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Les règles de codage sont issues à la fois de l'habitude de faire des gens qui les rédigent et puis du fruit de l'expérience .
    Globalement, je pense que if/else à la place du ?: a surtout comme objectif de maintenir la lisibilité et n'est pas si contraignante que ça (à contrario, une fois, dans un projet C++, il était interdit de faire du template et des exceptions: là, ça m'a paru plus aberrant).
    Maintenant, à titre perso, quand je n'ai pas de telles règles à respecter, j'utilise l'opérateur ternaire. Comme l'a dit Klaim je crois, ça reste souvent dans le cadre d'initialisation.

  18. #18
    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 : 50
    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
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Globalement, je pense que if/else à la place du ?: a surtout comme objectif de maintenir la lisibilité
    C'est justement ce point que je conteste. Déjà, je n'ai pas vu d'argument qui m'expliquerait en quoi ?: serait intrinsèquement moins lisible que if (à part de la part de gens qui font #define BEGIN {).

    Ensuite, je voulais développer un cas classique où je trouve ?: plus lisible. Exemple ici d'un code que j'ai tapé aujourd'hui (programme non livré au client, donc détection d'erreur minimaliste):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int seed;
    if (argc == 2)
    {
      seed = lexical_cast<double>(argv[1]);
    }
    else
    {
      seed = time(NULL);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int seed = (argc == 2) ?
      lexical_cast<double>(argv[1]) :
      time(NULL);
    Quand je lis le code 1, je me dis : Bon, maintenant, on va parcourir les arguments passés en ligne de commande.
    Quand je lis le code 2, je me dis : Bon, maintenant, on va initialiser la graine du générateur aléatoire.

    Le if met l'accent sur l'élément de test, le ?: met l'accent sur la finalité de celui-ci.

    Les deux peuvent être valides, mais je donne un sens différent à mon code selon celui que j'utilise. Par exemple, si mon programme acceptait plusieurs arguments, dans le code 1, je m'attendrais à avoir tout de suite après le traitement de l'argument suivant. Pas forcément dans le code 2.

    Autre aspect, dans le code 2, je n'ai pas de variable non initialisée, j'en ai une dans le code 1. A lui seul, cet argument me fait préférer ?: dans un certain nombre de cas (tout comme un ?: à l'intérieur d'un return peut faire un code plus proche d'un code SESE, même si je ne prône pas particulièrement ce style).
    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.

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

Discussions similaires

  1. surcharge d'opérateur if ternaire
    Par elmcherqui dans le forum C++
    Réponses: 5
    Dernier message: 18/06/2008, 20h44
  2. [gcc] opérateur conditionnel ternaire "?:"
    Par mamelouk dans le forum C++
    Réponses: 33
    Dernier message: 22/08/2007, 14h46
  3. Equivalant opérateur ternaire C++
    Par Pero dans le forum Langage
    Réponses: 5
    Dernier message: 07/10/2005, 09h44
  4. [java] pb Opérateur ternaire
    Par phileme dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 04/07/2004, 13h10
  5. Opérateur ternaire
    Par MASSAKA dans le forum Langage
    Réponses: 14
    Dernier message: 13/05/2004, 15h50

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