La beauté de l'opérateur ternaire contre si l'instruction
Je suis la navigation à travers une code et j'ai trouvé quelques ternaire opérateurs en elle. Ce code est une bibliothèque que nous utilisons, et que c'est censé être assez rapide.
Je suis en train de penser si nous économisons tout, sauf pour l'espace là-bas.
Quelle est votre expérience?
- Si ternaire été plus rapide que si-états (ou vice versa) les compilateurs serait certainement convertir l'un à l'autre. Donc, ils ne devraient pas avoir différentes caractéristiques de performance (en supposant que vous faites à la fois des énoncés à qualité égale).
- Si quoi que ce soit, c'est un µ-optimisation. En cas de doute: l'indice de référence.
- double possible de Avantages de l'utilisation du conditionnel ?: (ternaire) de l'opérateur
- hein... cogner à une vieille question, afin de faire la promotion de votre propre? vous pourriez trouver vous-même banni mon ami...
- nawfal: que le lien est spécifiquement pour C#, donc à mon humble avis pas une bonne double
- vous les gars ... 🙂
- Il serait préférable de demander pour une seule langue, il n'est probablement pas possible de répondre autrement. Version C++: stackoverflow.com/questions/3565368/ternary-operator-vs-if-else
Vous devez vous connecter pour publier un commentaire.
Performance
L'opérateur ternaire ne présentent pas de différences dans les performances d'un bien équivalent écrit
if
/else
déclaration... ils peuvent bien se résoudre à la même représentation de l'Arbre de Syntaxe Abstraite, à subir les mêmes optimisations, etc..Choses que vous ne pouvez faire avec ? :
Si vous êtes en cours d'initialisation d'une constante ou de référence, ou de la valeur à utiliser à l'intérieur d'un membre de l'initialisation de la liste, puis
if
/else
déclarations ne peuvent pas être utilisés, mais?
:
peut être:Affacturage pour code concis
Clés raisons d'utiliser
?
:
inclure la localisation, et en évitant la redondance de répéter les autres parties de la même consolidés/fonction-les appels, par exemple:...n'est préférable à...
...sur la lisibilité des motifs si vous traitez avec très peu d'expérience des programmeurs, ou certains de ces termes sont assez compliqué pour le
?
:
structure se perdent dans le bruit. Dans des cas plus complexes comme:Un équivalent
if
/else
:C'est beaucoup d'extra appels de fonction, le compilateur peut ou ne peut pas optimiser loin.
Ne peut pas nommé temporaires améliorer le si/d'autre monstruosité ci-dessus?
Si les expressions
t1
,f1
,t2
etc. sont trop verbeux pour taper à plusieurs reprises, la création d'nommé temporaires peuvent aider, mais alors:De performance correspondant
?
:
vous pouvez avoir besoin d'utiliserstd::move
, sauf lorsque le même temporaire, est passé à deux&&
paramètres dans la fonction appelée: ensuite, vous devez l'éviter. C'est plus complexe et sujette à erreur.c
?
x:
y évalue c alors, soit, mais pas les deux de x et y, ce qui le rend sûr pour dire que le test d'un pointeur n'est pasnullptr
avant de l'utiliser, tout en procurant une certaine valeur de repli et/ou du comportement. Le code ne reçoit que les effets secondaires de celui de x et y est effectivement sélectionné. Avec nommée temporaires, vous pouvez avoir besoinif
/else
autour ou?
:
à l'intérieur de leur initialisation non désiré de l'exécution du code, ou une exécution de code plus souvent que souhaité.Différence fonctionnelle: unifier le type de résultat
Considérer:
Dans l'opérateur conditionnel version ci-dessus,
1
subit une Conversion Standard dedouble
de sorte que le type appariés2.0
, sens de lais(double)
surcharge, même pour lestrue
/1
situation. Leif
/else
déclaration ne donne pas lieu à cette conversion: letrue
/1
direction générale des appelsis(int)
.Vous ne pouvez pas utiliser des expressions avec un ensemble du type de
void
dans un opérateur conditionnel soit, alors qu'ils sont valides dans les déclarations en vertu d'unif
/else
.L'accent: la valeur de sélection avant/après d'action nécessitant des valeurs
Il y a un accent différent:
Un
if
/else
déclaration souligne la ramification de la première et de ce qui est à faire est secondaire, alors qu'un opérateur ternaire souligne que faut-il faire sur la sélection des valeurs à le faire avec.Dans différentes situations, que ce soit de mieux refléter le programmeur "naturelles" de point de vue sur le code et le rendre plus facile à comprendre, de vérifier et de maintenir. Vous pouvez trouver vous-même la sélection de l'un sur l'autre en fonction de l'ordre dans lequel vous tenez compte de ces facteurs lors de l'écriture du code - si vous vous êtes lancé dans le "faire quelque chose", puis trouver, vous pouvez utiliser un couple (ou peu) les valeurs de le faire avec,
?
:
est la moins perturbatrice façon d'exprimer que, et de continuer votre codage "flux".try { true ? p = 0, new AudioClip() : 0; } catch (...) { if (p) delete p; }
? C'est juste totalement cassé. N'avez-vous pas remarquez quep
était toujours réglé à 0, et lenew
-ed objet d'une fuite?new Image()
jette ensuitetheAudioClip
seradelete
d en dépit d'être non initialisée. Vous pouvez résoudre ce problème: tous les pointeurs doivent être initialisées avant le premier membre de données (c'est à diretheName
) constructeur pourrait lancer, étant donné que vous avez untry
/catch
autour du constructeur, comme dans: theName((theImage = theAudioClip = nullptr, name))
. Plus agréable avec le pointeur de données des membres de la première, mais encore fragile.Bien...
J'ai fait quelques tests avec GCC et cet appel de fonction:
L'résultant du code assembleur avec gcc-O3 avait 35 instructions.
Le code équivalent avec if/else + variables intermédiaires eu 36. Avec imbriqué si/d'autre en utilisant le fait que les 3 > 2 > 1, j'ai eu 44. Je n'ai même pas essayer de l'étendre vers séparer les appels de fonction.
Maintenant, je n'ai pas d'analyse de la performance, ni ai-je fais une vérification de la qualité de l'résultant du code assembleur, mais à quelque chose de simple comme ça avec aucune boucle e.t.c. Je crois que plus court, c'est mieux.
Il semble qu'il y ait une certaine valeur aux opérateurs ternaires, après tout 🙂
C'est que si la vitesse du code est absolument crucial, bien sûr. If/else sont beaucoup plus facile à lire si imbriqués que quelque chose comme (c1)?(c2)?(c3)?(c4)?:1:2:3:4. Et ayant un grand expressions comme arguments de la fonction est pas plaisir.
Également garder à l'esprit que imbriquée ternaire expressions de faire du refactoring du code ou de débogage en plaçant un tas de pratique printfs() à une condition beaucoup plus difficile.
Le seul avantage potentiel pour le ternaire des opérateurs sur la plaine si les déclarations de mon point de vue est leur capacité à être utilisés pour les initialisations, ce qui est particulièrement utile pour
const
:E. g.
De faire ça avec un if/else bloc est impossible sans l'aide d'une fonction cal ainsi. S'il vous arrive d'avoir beaucoup de cas de const choses comme ce que vous pourriez trouver il y a un petit gain de l'initialisation d'un const correctement sur cession avec if/else. Mesurer! Ne sera probablement même pas être mesurable si. La raison que j'ai tendance à faire, c'est parce qu'en le marquant const le compilateur sait quand je fais quelque chose de plus tard qui pourrait/serait accidentellement modifier quelque chose que je pensais était fixe.
Effectivement ce que je dis, c'est que l'opérateur ternaire est important pour la const-correct, et l'const exactitude est une excellente habitude à être dans:
Vous supposez qu'il y doit être une distinction entre les deux, alors qu'en fait, il y a un certain nombre de langues qui renoncent à l' "if-else" déclaration en faveur d'un "if-else" expression (dans ce cas, ils peuvent même ne pas avoir l'opérateur ternaire, qui n'est plus nécessaire)
Imaginer:
De toute façon, l'opérateur ternaire est une expression dans certains langages (C,C#,C++,Java,etc) qui ne pas ont "if-else" expressions et donc il sert un rôle distinct là.
Si vous êtes inquiet à ce sujet à partir d'un point de vue des performances alors je serais très surpris s'il y avait une différence entre les deux.
D'un look 'n sentons point de vue, c'est surtout vers le bas à la préférence personnelle. Si la condition est court et le vrai/faux les parties sont courtes, puis d'un opérateur ternaire est très bien, mais rien de plus tend à être meilleure dans un if/else (à mon avis).