31 votes

Opérateur conditionnel C (#39;?#39;) avec le deuxième paramètre vide

Typiquement, l'opérateur '?' est utilisé sous la forme suivante:

Toutefois, dans les cas où B et A, j'ai vu l'abréviation suivante

Cela fonctionne étonnamment. Est-il préférable de laisser le deuxième paramètre dans (style sage), ou est leur chance certains compilateurs ne seront pas en mesure de gérer cela?

26voto

Juri Robl Points 2238

Il n'est pas autorisé par la langue C (pour autant que je sache), mais les compilateurs tels que gcc ont le raccourci a?:c comme une extension. signifie le même que .

12voto

Prasoon Saurav Points 47488

C'est une extension de gcc

Conditionnels avec Operands omis

équivaut à

3voto

Jerry Coffin Points 237758

Sauf si je suis mal erreur, vous utilisez une extension de compilateur (à une conjecture, gcc). Je suis presque sûr que la norme ne vous permet pas d'omettre le deuxième opérande à l'opérateur ternaire.

3voto

Morpfh Points 2288

- Je remplir un peu.

La norme utilise le terme opérateur conditionnel.

La syntaxe
 conditionnel expression:
logique-OU-expression
 logique-OU-expression ?  expression : conditionnel-l'expression

Une expression conditionnelle ne donne pas une lvalue. Aussi; Wikipedia; Conditionnel

Note: I. e.: C++ a:
logique-OU-expression ? expression : attributiond'expression

Contraintes:
* Le premier opérande doit avoir un type scalaire[1].
* L'une des opérations suivantes tiendra pour la deuxième et la troisième opérandes:
 - les deux opérandes ont arithmétique de type[2];
 - les deux opérandes ont la même structure[3] ou de l'union de type[4];
 - les deux opérandes ont type void[5];
 - les deux opérandes sont des pointeurs vers qualifié ou non qualifié[6] les versions compatibles
 types[7];
 - l'un des opérandes est un pointeur et l'autre est un pointeur null constant[8]; ou
 - l'un des opérandes est un pointeur vers un objet ou d'un type incomplète[9] et les autres 
 est un pointeur vers un qualifié ou non qualifié version de vide.

Pied de la nourriture:

[1] type Scalaire : Arithmétique des types et des types de pointeur.
[2] l'Arithmétique type : Entier et les types flottants.
[3] type de Structure : Une façon séquentielle alloué ensemble non vide d'états des objets (et, dans
 certaines circonstances, un tableau incomplet), dont chacune a un
 éventuellement nom spécifié et, éventuellement, type distinct.
[4] type d'Union : Un chevauchement ensemble non vide d'états des objets, dont chacun a
 éventuellement nom spécifié et, éventuellement, type distinct.
[5] type Void : Un ensemble vide de valeurs; elle est incomplète type qui ne peut pas être
terminé.
[6] Qualifiés de type : 1998 (const et volatile), 1999 (restreindre), respectivement 
 2011 (_Atomic). *[7] type Compatibles : Leurs types sont les mêmes.
[8] Null ptr. const.: NULL; mise en œuvre définies par pointeur null constante.
[9] de type Incomplète : les Types de décrire des objets, mais le manque d'informations nécessaires pour déterminer 
 leurs tailles.

*Type de qualificatifs en C

Donc: Pas sage de l'utiliser.

1voto

LuisEspinoza Points 4917

J'ai fait un peu de recherche dans le web, acording à wikipedia, ce comportement est soutenu 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 illégal. Soit dit en passant, cet opérateur est appelé binaire ternaire afin que vous puissiez naviguer à ce sujet.

Modifier:

J'ai vérifié dans gcc et apple llvm et il fonctionne très bien.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X