web-dev-qa-db-fra.com

Opérateur C conditionnel ('?') Avec second paramètre vide

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?

39
Locksleyu

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.

36
Juri Robl

C'est une extension de gcc 

Conditionals avec opérandes omis

x ? : y est équivalent à x ? x : y

16
Prasoon Saurav

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.

3
Jerry Coffin

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. 

* Qualificatifs de type en C

Donc: Pas sage d'utiliser.

3
Morpfh

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.

1
LuisEspinoza

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.

0
Mike Foss