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 :

Operateur ternaire vs if/else if/else


Sujet :

C

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2011
    Messages : 35
    Par défaut Operateur ternaire vs if/else if/else
    Dans un soucis de recherche d'optimisation, je me pose la question qu'est-ce qui serait le plus optimise au niveau du temps (et non pas des ressources), une ternaire ou une suite d'if/else if/else?
    Apres avoir fait des recherches je n'ai rien trouve c'est pour ca que je viens poser la question ici.

    Merci
    Cordialement

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    C'est juste une écriture différente.
    Je ne pense pas que le compilateur fasse une différence entre l'opérateur ternaire et le if/else.

  3. #3
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 492
    Billets dans le blog
    1
    Par défaut
    Une personne avait fait un test comparatif des codes ASM générés pour une structure if / else et une structure ternaire. Tu pourras retrouver ses commentaires ici : http://www.developpez.net/forums/d12...e/#post6722871
    Avec le compilateur et la cible utilisés, il n'avait pas de différence. Tu peux essayer de regarder avec ton compilateur ce que ça donne.

    De plus, je pense qu'il y a beaucoup d'optimisations à faire avant de remplacer des if / else par des structures ternaires. Si tu as encore d'autres choses à optimiser, ça me parait plus intéressant à faire que de s'attaquer à bencher les structures ternaires.

  4. #4
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Bonjour,

    Citation Envoyé par darkhades Voir le message
    Dans un soucis de recherche d'optimisation
    Regarde les profileurs de code, type gprof ou purify/quantify, qui t'indiqueront dans quelles fonctions tu passes le plus de temps.
    Ensuite seulement, commence a optimiser ces fonctions.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2011
    Messages : 35
    Par défaut
    Merci pour ces reponses, pour l'optimisation j'utilise gprof, donc pas de soucis pour cela, mais si je peux remplacer certain if un peu sal par une ternaire propre j'aime bien

  6. #6
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Citation Envoyé par darkhades Voir le message
    si je peux remplacer certain if un peu sal par une ternaire propre j'aime bien
    En general, on considere plutot le contraire : l'utilisation d'ecritures explicites est plus propre que l'utilisation de notations un peu absconses
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  7. #7
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par gangsoleil Voir le message
    En general, on considere plutot le contraire : l'utilisation d'ecritures explicites est plus propre que l'utilisation de notations un peu absconses
    et permet à l'optimiseur du compilateur de code de mieux travailler.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  8. #8
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Personnellement, je ne trouve pas que l'opérateur ternaire soit particulièrement obscur. Naturellement, il ne faut pas s'amuser en les emboîter, parce que, là, ça devient vite illisible (mais les if/else aussi). C'est un méconnu, car le programmeur trouve toujours des alternatives à son utilisation et n'est pas motivé pour se familiariser avec.

    Son intérêt est plus abstrait pour le programmeur : il constitue une expression alors que if/else ne l'est pas. Il peut être utilisé partout où on attend une expression. C'est donc un outil supplémentaire à la disposition du programmeur pour simplifier le code !

    Un exemple (évidemment un peu exotique),
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    //(1)
    if (a ? b : c) ...
    //est presque équivalent à
    //(2)
    if(a&& b || !a&&c)...
    (2) est-il beaucoup plus lisible que (1) ? Il peut amener deux fois l'évaluation de a. Et si cette évaluation a des effets de bords, il faut alors passer par une variable intermédiaire.
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    //(2')
    x = a;
    if(x&& b || !x&&c)...
    Croyez vous vraiment que la deuxième forme soit plus claire (et plus efficace) que la première ? Il ne faut donc pas généraliser.

  9. #9
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 442
    Par défaut
    Citation Envoyé par diogene Voir le message
    Personnellement, je ne trouve pas que l'opérateur ternaire soit particulièrement obscur.
    +1 !

    Naturellement, il ne faut pas s'amuser en les emboîter, parce que, là, ça devient vite illisible (mais les if/else aussi).
    Et encore, si l'on imbrique des opérateurs ternaires de façon terminale, par exemple de cette façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        s = i==1 ? "Un"
          : i==2 ? "Deux"
          : i==3 ? "Trois"
          : i==4 ? "Quatre"
          : i==5 ? "Cinq"
          :        "Indéterminé" ;

    Ce n'est pas non plus franchement abscons. Ça aurait même plutôt tendance à éclaircir le code au maximum en ne faisant apparaître pratiquement que les données.

  10. #10
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Et encore, si l'on imbrique des opérateurs ternaires de façon terminale, par exemple de cette façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        s = i==1 ? "Un"
          : i==2 ? "Deux"
          : i==3 ? "Trois"
          : i==4 ? "Quatre"
          : i==5 ? "Cinq"
          :        "Indéterminé" ;

    Ce n'est pas non plus franchement abscons. Ça aurait même plutôt tendance à éclaircir le code au maximum en ne faisant apparaître pratiquement que les données.
    Pour moi, ce genre de code est typiquement un code difficilement lisible. En tout cas, plus qu'un switch.

    Sur un exemple, notamment avec a, b et c, l'utilisation de l'operateur ternaire est toujours lisible. Le probleme, c'est que dans un vrai code, on rencontre rarement des exemples aussi simples.

    L'exemple un peu moins simple suivant me semble completement illisible avec un operateur ternaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    (config == NULL) ? print_error ("null pointer not allowed") 
        : config.filename == NULL ? print_error ("cannot open NULL file") 
        : file = fopen (config->filename, "r") ;
    Dans un hello_world, utiliser l'operateur ternaire ou n'importe quoi d'autre importe peu. Dans un code qui doit etre maintenable et lisible rapidement par n'importe qui, je trouve souvent qu'il n'a pas d'interet.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  11. #11
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
          (config == NULL)          ?   print_error ("null pointer not allowed") 
     
        : config.filename == NULL   ?   print_error ("cannot open NULL file") 
     
        : file = fopen (config->filename, "r") ;
    C'est déjà un peu plus lisible^^

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if(config == NULL)
           print_error ("null pointer not allowed");
    else if(config.filename == NULL)
            print_error ("cannot open NULL file");
    else
             file = fopen (config->filename, "r") ;
    Après je pense que c'est aussi une question d'habitude.
    Il vaudrait alors mieux utiliser if/else if/else plutôt que l'opérateur ternaire car les lecteurs ont plus l'habitude des if/else if/else.

    En effet, pour la première version, il faut que je passe quelques seconde à me rappeler que ce qui est entre le ':' et le '?' correspond à la condition du else if etc ... alors qu'avec les if, c'est plus automatique.

  12. #12
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        s = i==1 ? "Un"
          : i==2 ? "Deux"
          : i==3 ? "Trois"
          : i==4 ? "Quatre"
          : i==5 ? "Cinq"
          :        "Indéterminé" ;
    Citation Envoyé par gangsoleil Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    (config == NULL) ? print_error ("null pointer not allowed") 
        : config.filename == NULL ? print_error ("cannot open NULL file") 
        : file = fopen (config->filename, "r") ;
    Il y a une énorme différence entre ces deux codes

    Le premier est une utilisation comme expression, le second comme une instruction (expression non affectée).

    Dans le premier cas, il s'agit de condenser un code pas forcément lisible non plus:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    switch(i){
          case 1 : s = "Un"; break;
          case 2 : s = "Deux"; break;
          case 3 : s = "Trois"; break;
          case 4 : s = "Quatre"; break;
          case 5 : s = "Cinq"; break;
          default : s = "Indéterminé"; break;
    }
    Moi, je préfère effectivement un ternaire bien indenté

    Bonus, la version ternaire garantie l'affectation, alors qu'il est toujours possible d'oublier le default (entre autre dans un vrai code).
    Autre bonus, cela permet aussi une utilisation comme initialiseur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const char* chaine = condition?"succes":"echec"

  13. #13
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Personnellement, je le formaterais ainsi , (attention aux parenthèses supplémentaires à ajouter):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    (config == NULL) ? print_error ("null pointer not allowed") 
                     : (config.filename == NULL) ? print_error ("cannot open NULL file") 
                                                 : (file = fopen (config->filename, "r")) ;
    Maintenant, je n'utiliserais pas l'opérateur ternaire sur ce genre de code :

    1- la logique de l'opérateur ternaire est
    expression booléenne ? expression1 : expression2
    et ici la logique du code est plutôt
    expression booléenne ? instruction1 : instruction2
    ce qui correspond bien à la fonctionnalité du if/else

    2- Il y a des contraintes, injustifiées ici, à l'emploi de l'opérateur ternaire : les deux expressions, expressions1 et expressions2, doivent être de type compatible, ce qui n'est (sans doute) pas le cas ici. De plus, si print_error() renvoie void ...
    L'utilisation du ternaire demanderai une écriture
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    file = (config == NULL) ? print_error ("null pointer not allowed") 
                            : (config.filename == NULL) ? print_error ("cannot open NULL file") 
                                                        : fopen (config->filename, "r") ;
    Avec print_error() renvoyant un (FILE*) NULL

    Bref, si je ne répugne pas à utiliser l'opérateur ternaire, je ne le considère pas comme la panacée.

    @Neckara
    En effet, pour la première version, il faut que je passe quelques seconde à me rappeler que ce qui est entre le ':' et le '?' correspond à la condition du else if etc ... alors qu'avec les if, c'est plus automatique.
    C'est ce que je disais plus haut :
    C'est un méconnu, car le programmeur trouve toujours des alternatives à son utilisation et n'est pas motivé pour se familiariser avec.

  14. #14
    Membre expérimenté Avatar de moins1
    Homme Profil pro
    Autre
    Inscrit en
    Février 2013
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Autre
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2013
    Messages : 85
    Par défaut
    Ça reste pratique l'opérateur ternaire ?:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%d maison%s", n, n > 1 ? "s": "");
    Un peu naïf comme exemple mais j'avais le cerveau à off


Discussions similaires

  1. Les tests conditionnels - If - Else if - Else
    Par stomerfull dans le forum Langage
    Réponses: 6
    Dernier message: 08/05/2008, 12h12
  2. strucute if(){} else if(){} else
    Par debutantasp dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 13/03/2008, 12h36
  3. refactoring de plusieurs if-else-if-else .
    Par elekis dans le forum Langage
    Réponses: 3
    Dernier message: 05/04/2007, 16h56
  4. [VB.Net] Opérateurs ternaires de comparaison en VB script
    Par petitmateo dans le forum ASP.NET
    Réponses: 2
    Dernier message: 01/02/2006, 13h30
  5. [Language]Opérateur ternaire 'doubleCouche ? 2 : 1'
    Par harris_macken dans le forum Langage
    Réponses: 6
    Dernier message: 30/03/2005, 13h47

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