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 :

[gcc] opérateur conditionnel ternaire "?:"


Sujet :

C++

  1. #21
    screetch
    Invité(e)
    Par défaut
    ++i est rapide pour les types complexes car tu ne dois pas realiser une copie. Realiser une copie d'un entier qui est perdue dans la nature ne coute rien. Executer une copie d'un iterateur de vector implique l'appel d'une methode, d'un constructeur, puis comme tu ne t'en sers pas, d'un destructeur.

    La version ++i modifie l'objet "in-place" (sur place) donc bye bye l'appel au constructeur et au destructeur =)

    Ensuite pour le envoi d'une valeur, ce n'est pas plus lent.
    Dans le pire des cas, l'operateur ternaire se comporte comme un if, c'est a dire qu'il separe ton code en deux branches et effectue l'affectation. Dans le meilleur des cas, il realise une operation sans saut et place l'unique resultat dans un registre, un peu comme quand on fait a+b => realisation de l'operation et stockage du resultat dans un registre.

    Pour que l'optimisation sans saut fonctionne il faut que tu lui files du code simple, par exemple un choix entre deux valeurs statiques.

    Ci dessus,
    est optimise sans saut avec des operations (pour ceux que ca interesse, le compilo genere le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    __asm
    {
       XOR eax,eax //mets 0 dans eax
       TEST test
       SETLE eax //mets 1 dans eax si le resultat des test etait faux, sinon 0
       ADD eax,eax+1 // ajoutes a eax eax+1, donc si eax vaut 0 ca vaut 1 sinon ca vaut 3
    }
    il existe des tonnes de petites optims pour cela, quelles que soient les valeurs.

    Mais si le resultat de ?: est a aller chercher dans une variable ou si il faut appeler une fonctio, pas de miracle, le compilo utilisera un saut jusqu'a la branche de code a effectuer.

    Ca revient exactement au meme dans un if, mais la detection des optis possibles dans le if est plsu compliquee, a la rigueur tu aides le compilo avec

    Donc moi quand il s'agit de se servir du resultat je prefere l'operateur ?: car il est comme une fonction (il renvoie une valeur)
    quand il s'agit d'executer du code sans renvoyer de valeur j'utilise if puisque chaque bloc est comme une petite procedure (ne renvoie pas de valeur)

    si le ?: devient trop complexe, alors je le vire et passe en if pour la lisibilité

  2. #22
    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 : 51
    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 koala01 Voir le message
    dans d'autres cas il y a clairement moyen de faire quelque chose d'incompréhensible
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void fonct(int i)
    {
        cout<<"salut "
            <<(i==0 ? "toi":(i>3 ? "la populace":"tout le monde"));
    }
    Ca, c'est parce que tu as mal indenté ton code.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void fonct(int i)
    {
        cout<<"salut " <<(i==0 ?
                  "toi":
                  i>3 ? 
                        "la populace":
                        "tout le monde");
    }
    Je trouve ça aussi lisible que la solution à base de if.

    La où je le trouve moins lisible, c'est quand les types sont non identiques, bien que proches, et qu'on doit caster :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    string f(bool b, string s)
    {
      return b ? s : string ("Empty");
    }
     
    string f(bool b, string s)
    {
      if (b)
        return s;
      else
        return "Empty";
    }
    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.

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Ca, c'est parce que tu as mal indenté ton code.
    Disons que je n'avais surtout aucun exemple en tête et que c'est la première chose qui me soit passée par l'esprit...

    Le but était surtout de faire comprendre l'idée
    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 averti
    Inscrit en
    Décembre 2003
    Messages
    65
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Décembre 2003
    Messages : 65
    Par défaut
    et si on a un code comme celui la :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf( "il y a %d element%s ",d,(d==1)?"":"s");
    comment est-il "transformé"?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(d==1)
    	printf( "il y a %d element%s ",d,"");
    else
    	printf( "il y a %d element%s ",d,"s");
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char *tmp;
    if(d==1)
    	tmp = "";
    else
    	tmp = "s";
    printf("il y a %d element%s",d,tmp);
    ou on peut pas savoir en quoi c'est "transformé" ou encore autre chose qui m'est pas passé par la tête?

  5. #25
    screetch
    Invité(e)
    Par défaut
    le deuxieme

  6. #26
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Ceci dit, je ferais plutot le test sur d<1...

    Juste histoire que le "s" ne soit pas rajouté si d==0
    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

  7. #27
    Membre averti
    Inscrit en
    Décembre 2003
    Messages
    65
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Décembre 2003
    Messages : 65
    Par défaut
    Citation Envoyé par screetch Voir le message
    le deuxieme
    a mon avis, ça doit même être transformé dans un truc comme (sans les optimisations dues au fait qu'on connaisse les chaines de caractères à la compilation) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char **tmp;
    if(d==1)
    	tmp = &("");
    else
    	tmp = &("s");
    printf("il y a %d element%s",d,*tmp);
    Pour que ça puisse marcher pour des classes plus complexes

    Exemple :
    la classe "ma_classe" implémente l'operateur << et n'a pas de constructeur par copie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int d;
    ma_classe chaine_vide,chaine_s;
    /* ... */
    cout << "element" << (d==1)?chaine_vide:chaine_s;
    fournirai

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int d;
    ma_classe chaine_vide,chaine_s;
    /* ... */
    ma_classe* tmp;
    if(d==1)
    	tmp = &chaine_vide
    else
    	tmp = &chaine_s;
    cout << "element" << *tmp;

  8. #28
    Membre averti
    Inscrit en
    Décembre 2003
    Messages
    65
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Décembre 2003
    Messages : 65
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Ceci dit, je ferais plutot le test sur d<1...

    Juste histoire que le "s" ne soit pas rajouté si d==0
    Alors moi et les histoires de 0 pluriel ou 0 singulier, ça me dépasse...

  9. #29
    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
    Citation Envoyé par mobi38 Voir le message
    Alors moi et les histoires de 0 pluriel ou 0 singulier, ça me dépasse...
    La règle est très simple : s'il y a 0 objets alors il n'y en a pas, et donc c'est bien évidemment du singulier

  10. #30
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par mobi38 Voir le message
    Alors moi et les histoires de 0 pluriel ou 0 singulier, ça me dépasse...
    Ben c'est relativement simple:

    Le pluriel ne s'applique qu'à ce qui dépasse 1:
    0=aucun->singulier
    1=... 1 ->singulier
    1.1> 1 ->pluriel

    Les deux seules exceptions sont "plus de un" et "moins de deux", pour la consonnance: ca "sonne mal" de dire "un sont ..." (alors que plus de un, ca commence à deux) ou "deux est ..." (alors que moins de deux, ca fait ... 1 ou 0)
    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

  11. #31
    screetch
    Invité(e)
    Par défaut
    j'avais jamais remarqué ca.

    Plus d'un chat EST mort sous les roues d'une voiture
    => mais y'en a plus qu'un! mais on met le singulier.

    Tiens rigolo ca ^^

  12. #32
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Hé oui, les bizarreries de la langue française
    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

  13. #33
    Membre averti
    Inscrit en
    Décembre 2003
    Messages
    65
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Décembre 2003
    Messages : 65
    Par défaut
    Citation Envoyé par Laurent Gomila Voir le message
    La règle est très simple : s'il y a 0 objets alors il n'y en a pas, et donc c'est bien évidemment du singulier
    oui, je vois ça...



    il me semble que on met un "s" à zéro objets, lorsque, si il y en avait (des objets), il y en aurait plusieurs

  14. #34
    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 mobi38 Voir le message
    oui, je vois ça...



    il me semble que on met un "s" à zéro objets, lorsque, si il y en avait (des objets), il y en aurait plusieurs
    Ca c'est dans une phrase négative qu'on applique cette règle.

    Par contre, en anglais zéro est un pluriel !

Discussions similaires

  1. opérateur if ternaire
    Par Kindersurpriz dans le forum Débuter
    Réponses: 17
    Dernier message: 07/08/2008, 20h04
  2. surcharge d'opérateur if ternaire
    Par elmcherqui dans le forum C++
    Réponses: 5
    Dernier message: 18/06/2008, 20h44

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