Typiquement le '?' opérateur est utilisé sous la forme suivante:
A ? B : C
Cependant, dans les cas où B = A, j'ai vu l'abréviation suivante
A ? : C
Cela fonctionne étonnamment. Est-il préférable de laisser le deuxième paramètre dans (style sage), ou est-ce que certains compilateurs ne seront pas en mesure de gérer cela?
Le langage C ne le permet pas (pour autant que je sache), mais des compilateurs tels que gcc ont le raccourci a?: C en tant que extension . a?:c
signifie la même chose que a?a:c
.
Sauf erreur de ma part, vous utilisez une extension de compilation (à deviner, gcc). Je suis presque sûr que la norme not vous permet d'omettre le deuxième opérande de l'opérateur ternaire.
Je remplis un peu.
La norme utilise le termeopérateur conditionnel.
Syntaxeexpression conditionnelle: expression-OU-logique expression-OU-logique ? expression: expression conditionnelle
Une expression conditionnelle ne produit pas de valeur lvalue. Aussi; Wikipédia; Conditionnel
Note: I.e .: C++ a:
Expression logique-OU? expression : affectation-expression
Contraintes: * Le premier opérande doit avoir un type scalaire[1]. * L’un des éléments suivants doit être conservé pour les deuxième et troisième opérandes: - les deux opérandes sont de type arithmétique[2]; - les deux opérandes ont la même structure [3] ou le même type d'union[4]; - les deux opérandes ont un type vide[5]; - les deux opérandes sont des pointeurs vers des versions qualifiées ou non qualifiées [6] de types Compatibles [7]; - un opérande est un pointeur et l'autre est une constante de pointeur nulle[8]; ou - un opérande est un pointeur sur un objet ou un type incomplet[9] et l’autre est un pointeur sur une version qualifiée ou non qualifiée de void.
Nourriture pour les pieds:
[1] Type scalaire: types arithmétiques et types de pointeur. [2] Type arithmétique: types entier et flottant. [3] Type de structure: ensemble d'objets membres non vides alloués séquentiellement (et, dans certaines circonstances, un tableau incomplet), chacun d'eux ayant un nom Éventuellement spécifié et un type éventuellement distinct. ][4] Type d'union: ensemble d'objets membres non vides qui se chevauchent et dont chacun a Un nom facultatif et éventuellement un type distinct. [5] Void type: ensemble de valeurs vide; c'est un type incomplet qui ne peut pas être complété. [6] Type qualifié: 1998 (const et volatile), 1999 (restrict), respectivement 2011 (_Atomic). *[7] Type compatible: leurs types sont les mêmes. [8] Null ptr. const .: NULL; constante du pointeur nul défini par l'implémentation. [9] Type incomplet: types qui décrivent les objets mais manquent d'informations nécessaires pour déterminer Leur taille.
Donc: Pas sage d'utiliser.
j’ai fait quelques recherches sur le Web, selon wikipedia, ce comportement est pris en charge par une extension GNU de C. http://en.wikipedia.org/wiki/%3F:#C
Il est donc très probable que d'autres compilateurs considèrent cela comme illégal. Au fait, cet opérateur s'appelle ternaire conditionnel pour que vous puissiez naviguer à son sujet.
MODIFIER:
J'ai vérifié dans gcc et Apple llvm et cela fonctionne bien.
Il est préférable de laisser le second paramètre dans. Si B change, vous ne vous souvenez peut-être pas de modifier l'instruction ci-dessus. En outre, d'autres personnes peuvent avoir des difficultés à lire votre code et à l'améliorer si vous laissez B en dehors de la déclaration.