Expressions
Une expression est une suite d'opérateurs et d'opérandes.
Un opérateur représente une action et les
opérandes ses paramètres.
Pour évaluer une
expression, il est nécessaire de connaître les
priorités entre les opérateurs qui la compose et leur
associativité. L'ordre d'éxecution des actions peut
être paramétré à l'aide des
parenthèses.
Exemple : i + 3 * j et (i + 3) * j
Opérateurs
Type
|
Opérateur
|
Postfixé |
[] . (params) expr++ expr-- |
Unaire |
++expr --expr +expr -expr ~ ! |
Conversion |
(type)expr |
Multiplicatif |
* / % |
Additif |
+ - |
Décalage |
<< >>
|
Relationnel |
< > >= <=
|
Test d'égalité |
== != |
Et bit à bit |
& |
Ou bit à bit exclusif |
^ |
Ou bit à bit inclusif |
| |
Et logique |
&& |
Ou logique |
|| |
Conditionnel |
?: |
Affectation |
= += -= *= /= %= >>= <<= >>>= &=
^= |= |
Les opérateurs sont classés par ordre de
priorité.
Les opérateurs binaires sont tous associatifs à gauche,
sauf
l'affectation.
Les opérateurs à effet de bord, comme ++ ne doivent
pas être utilisées lors de l'appel de fonction car l'ordre
d'évaluation des paramètres est indéfinie. Voir test_effet_bord.c.
$ test_effet_bord
2 1
Le type des opérandes influe sur la nature de
l'opération et son résultat. Certaines conversions sont
également faites de façon implicite. Voir test_types2.c.
$ test_types2
0.000000 0.666667 0.666667
Arithmétique des pointeurs
L'arithmétique sur les pointeurs tient compte du type de l'objet
pointé. Ainsi, une addition sur un pointeur peut être vue
comme Ainsi, *(t +i), si
t est un tableau, est équivalent à t[i]. Voir test_pointeurs.c.
$ test_pointeurs
&c = bffffbd0, sizeof(c) = 1,
pc+1 = bffffbd1
&i = bffffbd8, sizeof(i) = 4,
pi+1 = bffffbdc
&s = bffffbe0, sizeof(struct
ma_struct) = 8, ps + 1 = bffffbe8
Balayage de t
contenu de bffffc00 = 1
contenu de bffffc04 = 2
contenu de bffffc08 = 3
contenu de bffffc0c = 4
Il est possible de créer des tableaux à plusieurs
dimensions :
float m[5][10];
Dans ce cas m[i][j] est
équivalent à *(m +
i*10 + j).
Dans le cas général, si
type
t[n1]...[nk];
t[i1]...[ik] sera
équivalent à * (t + i1*n2*
... *nk + i2*n3* ... *nk + ... + ik)