Je veux utiliser l'opérateur ternaire sans autre en C. Comment dois-je faire.
(a)? b: nothing;
quelque chose comme ça. Qu'est-ce que j'utilise en rien?
Si vous utilisez un opérateur ternaire comme celui-ci, il pourrait probablement être remplacé par:
if (a) { b; }
ce qui est beaucoup, beaucoup mieux. (L'intention est plus claire, donc le code est plus facile à lire et il n'y aura aucune perte de performances.)
Cependant, si vous utilisez l'opérateur ternaire comme expression, c'est-à-dire.
printf("%d cat%s", number_of_cats, number_of_cats != 1 ? "s" : <nothing>);
a = b*c + (d == 0 ? 1 : <nothing>);
puis le <nothing>
la valeur dépend du contexte dans lequel elle est utilisée. Dans mon premier exemple, <nothing>
devrait être ""
, et dans le second, il devrait être 0
.
Une fausse expression omise n'est pas valide. Essayez plutôt d'inverser la condition.
(!a) ?: b;
if-else
est une construction de flux de contrôle où ?:
est un opérateur et x ? y : z
est une expression - une expression ne peut pas avoir "aucune valeur", tandis que le flux de contrôle peut avoir un "ne rien faire". Il n'y a pas de réelle équivalence entre if-else et?: - ils ne sont pas interchangeables en toutes circonstances.
Vous pouvez obtenir l'effet souhaité dans certaines circonstances, mais c'est probablement moins efficace que d'utiliser if
sans else
. Par exemple, l'effet de:
if( x )
{
y = z ;
}
peut être atteint par:
y = x ? z : y ;
mais il existe un système efficace mais redondant else y = y
affectation lorsque x est faux que votre compilateur peut optimiser ou non. Vous pouvez donc obtenir l'effet mais uniquement si vous connaissez la "valeur actuelle" à renvoyer comme ?:
résultat de l'expression.
Vous ne pouvez pas omettre la partie else
. Utilisez simplement une expression nulle.
Mais, dans ce cas, il est souvent préférable d'utiliser un if
...
Il semble que cette question existe depuis un certain temps, mais FWIW, un court programme C compilé avec GCC 4.6.3 a révélé ce qui suit:
a = a ? b:;
. msgstr "erreur: expression attendue avant le jeton"; "".a = a ?: b;
et a = a ? a : b;
Peut-être que quelqu'un peut ajouter plus de détails côté compilateur, mais pour moi, il semble que l'omission du chemin d'exécution true
soit juste fantaisiste.
J'ai essayé d'y mettre des entiers et cela fonctionne bien. Par exemple, si vous voulez retourner "a" s'il est évalué vrai, vous pouvez l'écrire comme:
true ? a : 1;
J'ai fait ça
isLeapYear(i) ? cout<< i<<endl: cout<<"" ;
Pas sûr cependant, s'il y a des performances atteintes avec cela.