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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 : 41
    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
    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 !!

  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
    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

  5. #5
    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 : 41
    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.

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

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 941
    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...

  7. #7
    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 :/

  8. #8
    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.

  9. #9
    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.

  10. #10
    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).

  11. #11
    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;

  12. #12
    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...

+ 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