GNT sans publicité, site mobile, fonctionnalitées exclusives...

Opérateurs '&' '?' et ':'

Le
PASDEPUBnoe.falzon
Bonjour à tous

Je suis en train de consulter une documentation sur l'API de mon
système, et les exemple de ce tutorial sont en C. Cependant, j'ai vu
apparaitre des opérateurs que je n'avais pas appris en C :
- & (seul entre deux variables en non pas collé devant une variable,
comme pour récupérer son adresse)
- ? (de même, entre deux variables)
- : (pareil)

Je vous donne un exemple :

#define MIN(a,b) ((a) < (b) ? (a) : (b))

Je me doute bien que cette macro sert à récupérer la plus petite des
variables, mais comme ces opérateurs me sont inconnus

if((eventSructPtr->modifiers & cmdKey) != 0)
{
blablabla
}

ou encore :

if(response & gestaltMenuMgrAquaLayoutMask)
{
etc
}

Comme je doute que les opérateurs ne puissent pas faire partie du C
standard, je me posais des questions

Merci d'avance

Noé
--
"Je ne deteste que les bourreaux" -- Albert Camus

Pour m'écrire, veuillez enlever PASDEPUB de mon adresse ;P
Lire les 9 réponses

Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Fabien Montagne
Le #41181
Salut,

#define MIN(a,b) ((a) < (b) ? (a) : (b))
C'est une macro (c'est à dire que c'est replacé directement dans le code par

le compilo). '?' indique que la première partie est une condition et en
indique la fin et ':' separe les deux alternatives ce qui donne dans ton
cas : si a
if((eventSructPtr->modifiers & cmdKey) != 0)
{
blablabla
}

ou encore :

if(response & gestaltMenuMgrAquaLayoutMask)
{
etc
}

là j'ai un doute quant à la validité car normalement l'opérateur c'est '&&'

et non '&' seul. C'est une façon à éviter les ambiguités entre adresse et
opérateur binaire.
Fabien

Emmanuel Delahaye
Le #40755
In 'fr.comp.lang.c', (Noé Falzon) wrote:

Je suis en train de consulter une documentation sur l'API de mon
système, et les exemple de ce tutorial sont en C. Cependant, j'ai vu
apparaitre des opérateurs que je n'avais pas appris en C :


Et ton livre de C, il en pense quoi?

- & (seul entre deux variables en non pas collé devant une variable,
comme pour récupérer son adresse)


C'est l'opérateur bit à bit 'AND' (ET). Il existe aussi

'|' : 'OR'
'^' : 'XOR' (eXclusiv OR)
'~' : 'NOT'
'<<' : 'SHL' (SHift Left)
'>>' : 'SHR' (SHift Right)

- ? (de même, entre deux variables)
- : (pareil)


C'est l'opérateur 'ternaire'

<expression> ? <value if true> : < value if false>

Je vous donne un exemple :

#define MIN(a,b) ((a) < (b) ? (a) : (b))

Je me doute bien que cette macro sert à récupérer la plus petite des
variables, mais comme ces opérateurs me sont inconnus...


int x = MIN (2,3)

se développe en

int x = 2 < 3 ? 2 : 3;

et est équivallent à

int x;

if (2 < 3)
{
x = 2;
}
else
{
x = 3;
}

if((eventSructPtr->modifiers & cmdKey) != 0)
{
blablabla
}

ou encore :

if(response & gestaltMenuMgrAquaLayoutMask)
{
etc
}

Comme je doute que les opérateurs ne puissent pas faire partie du C
standard, je me posais des questions...


Dans ce cas, ouvrir son livre de C, ou consulter l'aide en ligne de son
compilateur:

<Borland C>

__________________________________
Opérateur conditionnel ( ? : )
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
L'opérateur conditionnel ?: est un opérateur ternaire..

Syntaxe:
expr-OU-logique ? expr : expr-condition

Dans l'expression E1 ? E2 : E3, l'opérande E1 doit être de type scalaire.
Les opérandes E1 et E3 doivent obéir à l'une des règles ci-dessous:

1. Tous deux sont de type arithmétique.

Dans ce cas, aussi bien E2 que E3 se
voient appliquer les conversions arithmétiques
habituelles et le type du résultat est le type
commun résultant de la conversion.

2. Les deux opérandes sont de type structure ou union
compatibles.

Dans ce cas le type du résultat est le type de la
structure de E2 et E3.

3. Les deux opérandes sont de type void.

Dans ce cas le résultat est de type void.

4. Les deux opérandes sont de type pointeur
sur une version qualifiée ou non de types
compatibles.

Dans ce cas le type du résultat est un pointeur
sur un type qualifié par tous les types qualifiés
des types pointés par les opérandes.

5. Un opérande est de type pointeur et l'autre une
constante pointeur nulle.

Dans ce cas, le type du résultat est un pointeur
sur un type qualifié par rapport à tous les
types qualifiés des types pointés par les opérandes.

6. Un opérande est de type pointeur sur un objet ou
un type incomplet, l'autre étant un pointeur sur
une version qualifiée ou non du type void.

Dans ce cas le type du résultat est celui de
l'opérande qui n'est pas pointeur sur void.

Dans tous les cas E1 est évalué en premier. Si la valeur est différente de
0, E2 est évalué et E3 est ignoré. Si E1 est égal à 0, E3 est évalué mais E2
ne l'est pas.

Le résultat de E1 ? E2 : E3 correspond à la valeur de E2 ou de E3 suivant le
cas.

______________________________________________
Opérateurs logiques et sur bits & ^ | && ||
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Turbo C++ fournit 5 opérateurs permettant de manipuler les opérations au
niveau du bit:

& ET entre bit
^ OU exclusif entre bit
| OU entre bit

&& ET logique
|| OU logique

Syntaxe:
AND-expression & equality-expression
exclusive-OR-expr ^ AND-expression
inclusive-OR-expr | exclusive-OR-expression
logical-AND-expr && inclusive-OR-expression
logical-OR-expr || logical-AND-expression

Dans les expressions les opérandes doivent être de type valeur.

E1 & E2 E1 ^ E2 E1 | E2

les deux opérandes doivent être de type scalaire.

E1 && E2 E1 || E2

Les conversions arithmétiques habituelles sont appliquées à E1 et E2.

En ce qui concerne les opérateurs au niveau du bit chaque bit du résultat
correspond à la table de vérité suivante:

En Entrée ¦ En sortie
¯¯¯¯¯¯¯¯¯ ¦ ¯¯¯¯¯¯¯¯¯
dans E1¦Dans E2¦ E1 & E2 ¦ E1 ^ E2 ¦ E1 | E2
-------Ï-------+---------Ï---------Ï--------
0 ¦ 0 ¦ 0 ¦ 0 ¦ 0
1 ¦ 0 ¦ 0 ¦ 1 ¦ 1
0 ¦ 1 ¦ 0 ¦ 1 ¦ 1
1 ¦ 1 ¦ 1 ¦ 0 ¦ 1

A l'inverse des opérateurs au niveau du bit, les opérateurs logiques && et
|| garantissent une opération de gauche à droite.

E1 est évalué en premier; s'il est égal à 0, E1 && E2 renvoient 0 et E2
n'est pas évalué.

Dans le cas de E1 || E2, si E1 est différent de 0, l'expression complète
renvoie 1 et E2 n'est pas évaluée.

Voir Aussi:
opérateur
</>

--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
<blank line>
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/

Emmanuel Delahaye
Le #40754
In 'fr.comp.lang.c', Fabien Montagne
if(response & gestaltMenuMgrAquaLayoutMask)
{
etc
}

là j'ai un doute quant à la validité car normalement l'opérateur c'est

'&&' et non '&' seul. C'est une façon à éviter les ambiguités entre
adresse et opérateur binaire.


Ou la la. Ouvrez vos livres de C les gars. Vous être graves...

--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
<blank line>
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/


Patrick Lamaizière
Le #40753
Fabien Montagne écrivait :

if(response & gestaltMenuMgrAquaLayoutMask)
{
etc
}

là j'ai un doute quant à la validité car normalement l'opérateur c'est

'&&' et non '&' seul. C'est une façon à éviter les ambiguités entre
adresse et opérateur binaire.


C'est valide, l'opérateur '&' effectue un "et" bit à bit. Ne pas
confondre avec le "et" logique ( && ). Bref c'est un masque comme
l'indique le nom de la variable.


PASDEPUBnoe.falzon
Le #40752
Emmanuel Delahaye

Ben mon bouquin sur le C n'était pas entré dans ces détails,
malheuresement.

En tout cas merci beaucoup !

--
"Je ne deteste que les bourreaux" -- Albert Camus

Pour m'écrire, veuillez enlever PASDEPUB de mon adresse ;P
Publicité
Suivre les réponses
Poster une réponse
Anonyme