expression :
lvalue =
expression
Dans le jargon C, une lvalue est une expression qui doit délivrer une variable (par opposition à une constante). Une lvalue peut être par exemple une variable simple, un élément de tableau, mais pas une constante. Cette notion permet d'exprimer dans la grammaire l'impossibilité d'écrire des choses du genre 1 = i qui n'ont pas de sens.
Exemples d'affectation :
i = 3 f = 3.4 i = j + 1
L'opérateur d'affectation a deux effets :
i = (j = k) + 1La valeur de k est affectée à j et cette valeur est le résultat de l'expression (j = k) ; on y ajoute 1 et le résultat est affecté à i.
Lorsque la valeur de l'expression est affectée à la lvalue, la valeur est éventuellement convertie dans le type de la lvalue. On peut par exemple affecter une expression entière à un flottant.
expression :
+ expression
expression1 + expression2
Les deux expressions sont évaluées, l'addition réalisée, et la valeur obtenue est la valeur de l'expression d'addition. (La sémantique de + expression est celle de 0 + expression).
L'ordre dans lequel les deux expressions sont évaluées, n'est pas déterminé. Si expression1 et expression2 font des effets de bords, on n'est donc pas assuré de l'ordre dans lequel ils se feront.
Après évaluation des expressions, il peut y avoir conversion de type de l'un des opérandes, de manière à permettre l'addition. On pourra par exemple faire la somme d'une expression délivrant un flottant et d'une expression délivrant un entier : l'entier sera converti en flottant et l'addition sera réalisée entre flottants.
L'opérateur peut être utilisé de manière unaire ou binaire :
expression :
- expression
expression1 - expression2
Les deux expressions sont évaluées, la soustraction réalisée, et la valeur obtenue est la valeur de l'expression soustraction. (La sémantique de - expression est celle de 0 - expression).
Les mêmes remarques concernant l'ordre d'évaluation des opérandes ainsi que les éventuelles conversions de type faites au sujet de l'addition s'appliquent à la soustraction.
expression :
expression1 * expression2
Les deux expressions sont évaluées, la multiplication réalisée, et la valeur obtenue est la valeur de l'expression multiplicative.
Les mêmes remarques concernant l'ordre d'évaluation des opérandes ainsi que les éventuelles conversions de type faites au sujet de l'addition s'appliquent à la multiplication.
expression :
expression1 /
expression2
Contrairement à d'autres langages, le langage C ne dispose que d'une seule notation pour désigner deux opérateurs différents : le signe / désigne à la fois la division entière et la division entre flottants.
Si expression1 et expression2 délivrent deux valeurs entières, alors il s'agit d'une division entière. Si l'une des deux expressions au moins délivre une valeur flottante, il s'agit d'une division entre flottants.
Dans le cas de la division entière, si les deux opérandes sont positifs, l'arrondi se fait vers zéro, mais si au moins un des deux opérandes est négatif, la façon dont se fait l'arrondi dépend de l'implémentation (mais il est généralement fait vers zéro). Exemple : 13 / 2 délivre la valeur 6 et -13 / 2 ou 13 / -2 peuvent délivrer -6 ou -7 mais le résultat sera généralement -6.
Les remarques concernant l'ordre d'évaluation des opérandes faites au sujet de l'addition s'appliquent également à la division. Les remarques concernant les éventuelles conversion de type faites au sujet de l'addition s'appliquent à la division entre flottants.
expression :
expression1 %
expression2
Les deux expressions sont évaluées et doivent délivrer une valeur de type entier, on évalue le reste de la division entière de expression1 par expression2 et la valeur obtenue est la valeur de l'expression modulo.
Si au moins un des deux opérandes est négatif, le signe du reste dépend de
l'implémentation, mais il est généralement pris du même signe que le dividende.
Exemples :
13 % 2
délivre 1
-13 % 2
délivre généralement -1
13 % -2
délivre généralement 1.
Les choix d'implémentation faits pour les opérateurs division entière et
modulo doivent être cohérents, en ce sens que l'expression :
b * (a / b) + a % b
(où a et b sont des entiers)
doit avoir pour valeur a.
expression :
expression1 opérateur expression2
où opérateur peut être l'un des symboles suivants :
opérateur | sémantique |
> |
strictement supérieur |
< |
strictement inférieur |
>= |
supérieur ou égal |
<= |
inférieur ou égal |
== |
égal |
!= |
différent |
Les deux expressions sont évaluées puis comparées, la valeur rendue est de type int et vaut 1 si la condition est vraie, et 0 sinon.
On remarquera que le type du résultat est int, car le type booléen n'existe pas.