OVH Cloud OVH Cloud

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

9 réponses
Avatar
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

9 réponses

Avatar
Fabien Montagne
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<b alors a sinon b.

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

Avatar
Emmanuel Delahaye
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/

Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', Fabien Montagne wrote:

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/


Avatar
Patrick Lamaizière
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.


Avatar
PASDEPUBnoe.falzon
Emmanuel Delahaye wrote many things...

<.../...>

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
Avatar
EpSyLOn
On Sun, 13 Jul 2003 14:44:58 +0200, (Noé
Falzon) wrote:

Emmanuel Delahaye wrote many things...

<.../...>

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


Dans ce cas, fait le entrer immédiatement dans ta cheminée avec une
allumette.


--
___
| | |/
sas.epsylon<at>wanadoo.fr | | (o o)
______ ______ _____ __ _ | |oOO_(_)_OOo
/ __ Y / ____/ / !' |/
| ____/ |__> |____ ` | |_ O | ^ |
_____/| ___/______X_ Y_______|___/__||__|
~*~ |__| ____/

Avatar
PASDEPUBnoe.falzon
EpSyLOn wrote:

Dans ce cas, fait le entrer immédiatement dans ta cheminée avec une
allumette.


;)

C'est le seul que j'aie... Je vais essayer de trouver le K&R pendant les
vacances !

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

Pour m'écrire, veuillez enlever PASDEPUB de mon adresse ;P

Avatar
EpSyLOn
On Sun, 13 Jul 2003 22:09:43 +0200, (Noé
Falzon) wrote:

EpSyLOn wrote:

Dans ce cas, fait le entrer immédiatement dans ta cheminée avec une
allumette.


;)

C'est le seul que j'aie... Je vais essayer de trouver le K&R pendant les
vacances !


Pas vraiment difficile a trouver... Il est dans toutes les librairies
qui ont un contenu informatique !

--
.-. EpSyLOn sas<dot>epsylon<at>wanadoo<dot>fr
oo| faq fclc: http://www.isty-info.uvsq.fr/~rumeau/fclc
/`' Usenet : http://www.usenet-fr.net
(_;/) "Bus error - passengers dumped"


Avatar
rixed
C'est le seul que j'aie... Je vais essayer de trouver le K&R pendant les
vacances !



Pas vraiment difficile a trouver... Il est dans toutes les librairies
qui ont un contenu informatique !


Je crois qu'il y a des bleds qui ne sont pas encore dotés de ce genre
d'équipements.

Par contre, il y a des tutoriels en ligne qui listent tous les
opétateurs du C, en attendant le K&R... :)