7
votes

Tous les paramètres de l'opérateur ternaire sont-ils obligatoires ou pouvez-vous faire »(Exp1 ?: Valeur)»?

J'aimerais savoir si dans l'opérateur ternaire dans la langue C, tous les paramètres sont obligatoires? EG:

(expr1 ? value1: value2);


3 Réponses :


4
votes

La norme C (faire référence à C11 code>) ne mentionne rien d'omettre le deuxième opérande. Il spécifie tous les trois opérandes de la forme

expression conditionnelle: em>
        ... Em> Logique-OR-Expression em>
          Logique-ou-expression em> ? Code> expression em> : code> expression conditionnelle em> p> BlockQuote>

Vous parlez d'un Extension du compilateur . La forme p> xxx pré>

retourne réellement exp1 code>, si exp1 code> est évalué vers true. P>

citant le Documentation en ligne pour GCC code>, P>

L'opérande intermédiaire dans une expression conditionnelle peut être omis. [...] p>

Par conséquent, l'expression p>

    x ? : y


8 commentaires

Pouvons-nous sauter la partie si fausse aussi?


NVM, la citation à Serge Répondre clarifie. J'ai demandé si la valeur 2 peut être omise.


@Eugenesh. Amende. Je viens d'ajouter un peu plus de contexte. J'espère que c'est utile. :)


Dans ce cas (le dernier paragraphe), il serait incorrect de dire qu'il est équivalent à x? x: y @Serge


@Eugenesh. Cet exemple est dans le contexte de l'exemple réel dans les documents en ligne. Il mentionne également "Dans ce cas simple, la capacité d'omettre l'opérande du milieu n'est pas particulièrement utile ....." :)


@Souravghwhosh Une question plus, vous dites "a la valeur de x si c'est non nulle", que se passe-t-il si vous écrivez x ?: Y et X Is Zero?


@annacoobs Ensuite, selon la propriété de Ternary opérateur, le troisième opérande y est évalué et la valeur de cela devient le résultat. :)


Même si les compilateurs ajoutent des extensions, il est fortement recommandé de ne pas les utiliser car ils brisent la portabilité et la compatibilité de votre code sur les différents compilateurs. La plupart des extensions de GCC ont été créées pour le système d'exploitation Linux (tandis que celui-ci ne semble pas corriger un problème technique, les autres extensions avaient). Alors utilisez votre clavier et n'ayez pas peur de 1 ~ 20 coups de frappe supplémentaires.



5
votes

Ce n'est pas une norme, mais Extension GCC (Peut-être d'autres compilateurs font de même):

5.7 Conditionnels avec des opérandes omis P>

L'opérande intermédiaire dans une expression conditionnelle peut être omis. Puis si Le premier opérande est non nul, sa valeur est la valeur de la expression conditionnelle. P>

Par conséquent, l'expression p>

 x ? x : y


1 commentaires

Vous voudrez peut-être noter que si x représente une expression complexe, elle ne sera évaluée qu'une seule fois.



4
votes

La déclaration

(exp1 ? exp1 : value2);


0 commentaires