103 votes

Avantages de l'utilisation de l'opérateur conditionnel ? : (ternaire)

Quels sont les avantages et les inconvénients de l'opérateur ? : par rapport à l'instruction if-else standard ? Les plus évidents sont :

Conditionnel ? : Opérateur

  • Plus court et plus concis lorsqu'il s'agit de comparaisons de valeurs directes et d'affectations.
  • Il ne semble pas être aussi flexible que la construction if/else.

Standard If/Else

  • Peut être appliqué à davantage de situations (comme les appels de fonction)
  • sont souvent inutilement longues

La lisibilité semble varier pour chacun d'entre eux en fonction de l'énoncé. Après avoir été exposé pour la première fois à l'opérateur ? :, il m'a fallu un certain temps pour comprendre son fonctionnement exact. Me recommanderiez-vous de l'utiliser autant que possible ou de m'en tenir à if/else, étant donné que je travaille avec de nombreux non-programmeurs ?

8 votes

Vous avez déjà compris l'essentiel.

0 votes

Je n'ai fait que peu de choses en C#, mais la plupart des langages autorisent les appels de fonction à l'intérieur de l'opérateur conditionnel. Le C# ne le permet-il vraiment pas ? Cela semble très étrange...

1 votes

@Nicholas Knight : Je suppose que le PO veut dire que vous ne pouvez pas faire, par exemple, SomeCheck() ? DoFirstThing() : DoSecondThing(); -- vous devez utiliser l'expression pour retourner une valeur.

123voto

Dan Tao Points 60518

Je recommanderais essentiellement de ne l'utiliser que lorsque l'instruction résultante est extrêmement courte et représente une augmentation significative de la concision par rapport à l'équivalent if/else sans sacrifier la lisibilité.

Un bon exemple :

int result = Check() ? 1 : 0;

Mauvais exemple :

int result = FirstCheck() ? 1 : SecondCheck() ? 1 : ThirdCheck() ? 1 : 0;

5 votes

Bien vu, mais pour info, c'est de la "concision".

6 votes

@mquander, vous êtes sûr de ça ? merriam-webster.com/dictionary/concise

1 votes

Hmm, allez savoir ; peut-être que ça peut tout aussi bien être l'un ou l'autre.

51voto

Jason Williams Points 31901

C'est à peu près couvert par les autres réponses, mais "c'est une expression" n'explique pas vraiment pourquoi c'est si utile...

Dans des langages comme C++ et C#, vous pouvez définir des champs locaux en lecture seule (dans le corps d'une méthode) en les utilisant. Cela n'est pas possible avec une instruction if/then classique, car la valeur d'un champ en lecture seule doit être affectée dans cette seule instruction :

readonly int speed = (shiftKeyDown) ? 10 : 1;

n'est pas la même chose que :

readonly int speed;  
if (shifKeyDown)  
    speed = 10;    // error - can't assign to a readonly
else  
    speed = 1;     // error  

De la même manière, vous pouvez intégrer une expression tertiaire dans un autre code. En plus de rendre le code source plus compact (et dans certains cas plus lisible), cela peut également rendre le code machine généré plus compact et plus efficace :

MoveCar((shiftKeyDown) ? 10 : 1);

...peut générer moins de code que de devoir appeler deux fois la même méthode :

if (shiftKeyDown)
    MoveCar(10);
else
    MoveCar(1);

Bien entendu, il s'agit également d'une forme plus pratique et plus concise (moins de saisie, moins de répétitions, et peut réduire les risques d'erreurs si vous devez dupliquer des morceaux de code dans un if/else). Dans les cas de "modèles communs" propres comme celui-ci :

object thing = (reference == null) ? null : reference.Thing;

... il est tout simplement plus rapide à lire/analyser/comprendre (une fois que l'on y est habitué) que le long et fastidieux équivalent if/else, et peut donc vous aider à "appréhender" le code plus rapidement.

Bien sûr, ce n'est pas parce que c'est utile ne signifie pas que c'est la meilleure chose à faire utiliser dans tous les cas. Je conseillerais de ne l'utiliser que pour de courts bouts de code dont la signification est claire (ou rendue plus claire) par l'utilisation de ?: - si vous l'utilisez dans un code plus complexe, ou si vous imbriquez des opérateurs ternaires les uns dans les autres, cela peut rendre le code horriblement difficile à lire.

0 votes

@JaminGrey "cela ne signifie pas que, lorsque la constante est créée, elle est fixée à 10 ou 1." Voulez-vous dire hace signifie cela ? Les commentaires incorrects peuvent causer plus de confusion aux nouveaux programmeurs C++ que le problème que vous avez tenté de résoudre ;)

5 votes

Pour les futurs lecteurs qui tomberaient sur ce texte, en " const int speed = (shiftKeyDown) ? 10 : 1 ; ", cela signifie que lorsque la constante est d'abord créé il est réglé sur 10 ou 1. Il s'agit de n'a pas signifie que chaque fois que l'on accède à la constante, une vérification est effectuée. (Au cas où un programmeur C++ plus récent serait confus).

2 votes

...ou pour le dire autrement, une const est constante, c'est-à-dire qu'elle ne peut pas être modifiée après l'exécution de l'instruction dans laquelle elle est déclarée.

14voto

Ryan Bright Points 21

Je choisis généralement un opérateur ternaire lorsque j'aurais beaucoup de code en double autrement.

if (a > 0)
    answer = compute(a, b, c, d, e);
else
    answer = compute(-a, b, c, d, e);

Avec un opérateur ternaire, cela pourrait être accompli de la manière suivante.

answer = compute(a > 0 ? a : -a, b, c, d, e);

12 votes

Personnellement, je ferais aVal = a > 0 ? a : -a; answer = compute(aVal,b,c,d,e); Surtout si b , c , d y e a également nécessité un traitement.

10 votes

Pourquoi utiliser une conditionnelle dans cet exemple ? Il suffit de récupérer Abs(a) et d'appeler compute() une fois.

2 votes

Oui, je n'ai pas créé le meilleur exemple. :)

12voto

wshato Points 503

Je trouve cela particulièrement utile lors du développement web si je veux définir une variable à une valeur envoyée dans la requête si elle est définie ou à une valeur par défaut si elle ne l'est pas.

3 votes

+1 valeurs par défaut dans le web dev est un excellent exemple un bon endroit pour utiliser l'opérateur ternaire

11voto

aib Points 18608

Une utilisation vraiment cool est :

x = foo ? 1 :
    bar ? 2 :
    baz ? 3 :
          4;

10 votes

Faites attention avec cela en PHP, l'opérateur ternaire s'associe de la mauvaise façon en PHP. Essentiellement, si foo est faux, alors l'ensemble sera évalué à 4 sans faire les autres tests.

4 votes

@TomBusby - Wow. Encore une autre raison de détester PHP, si vous êtes quelqu'un qui déteste déjà PHP.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X