web-dev-qa-db-fra.com

opérateur ternaire sans autre en C

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?

28
user437777

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.

40
huon

Une fausse expression omise n'est pas valide. Essayez plutôt d'inverser la condition.

(!a) ?: b;
15
GOSteen

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.

10
Clifford

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...

3
md5

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:

  1. Ce qui suit ne se compile pas: a = a ? b:;. msgstr "erreur: expression attendue avant le jeton"; "".
  2. Ce qui suit est équivalent: 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.

2
danns87

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;
0
Y.Du

J'ai fait ça

isLeapYear(i) ? cout<< i<<endl: cout<<"" ;

Pas sûr cependant, s'il y a des performances atteintes avec cela.

0
0xcrab