Le langage C comporte quelques autres opérateurs que nous allons étudier ci-après.
expression :
~
expression
expression est évaluée et doit délivrer une valeur de type entier,
l'opération non bit à bit est réalisée sur cette valeur, et le
résultat obtenu est la valeur de l'expression ~
.
expression :
expression1 &
expression2
Les deux expressions sont évaluées et doivent délivrer des valeurs de type
entier, le et bit à bit est réalisé, et la valeur
obtenue est la valeur de l'expression &
.
expression :
expression1 | expression2
Les deux expressions sont évaluées et doivent délivrer des valeurs de type entier, le ou bit à bit est réalisé, et la valeur obtenue est la valeur de l'expression |.
expression :
expression1
^
expression2
Les deux expressions sont évaluées et doivent délivrer des valeurs de type
entier, le ou exclusif bit à bit est réalisé, et la valeur
obtenue est la valeur de l'expression ^
.
expression :
expression1 << expression2
Les deux expressions sont évaluées et doivent délivrer des valeurs de type entier, la valeur de expression1 est décalée à gauche de expression2 bits en remplissant les bits libres avec des zéros. Le résultat obtenu est la valeur de l'expression <<.
expression :
expression1
>> expression2
Les deux expressions sont évaluées et doivent délivrer des valeurs de type entier, la valeur de expression1 est décalée à droite de expression2 bits. Si expression1 délivre une valeur unsigned, le décalage est un décalage logique : les bits libérés sont remplis avec des zéros. Sinon, le décalage peut être logique ou arithmétique (les bits libérés sont remplis avec le bit de signe), cela dépend de l'implémentation.
expression :
expression1 ? expression2
: expression3
expression1 est évaluée et doit délivrer une valeur de type entier. Si cette valeur est :
max = a > b ? a : b;On peut utiliser cet opérateur en cascade, mais la lisibilité en souffre :
printf("i est %s",i < 0 ? "negatif\n" : i > 0 ? "positif\n" : "nul\n");
expression :
expression1 , expression2
expression1 est évaluée et sa valeur ignorée. expression2 est évaluée et sa valeur est la valeur de l'expression virgule.
i = (j = 2 , 1);ce qui est une manière particulièrement horrible d'écrire :
i = 1; j = 2;
Une utilisation agréable par contre de l'opérateur virgule est dans les expressions d'une boucle for. Si on désire écrire une boucle for qui utilise deux index, il est utile d'écrire par exemple :
for (i = 1, j = 1; i <= LIMITE; i++, j = j + 2) { ... }ceci permet de rendre manifeste que i = 1 et j = 1 sont la partie initialisation et i++ et j = j + 2 sont la partie itération de la boucle.
+ - * / % >> << & ^ |
peut s'associer à
l'opérateur d'affectation pour former respectivement les opérateurs
+= -= *= /= %= >>= <<= &= ^= |=
.
Nous donnerons la syntaxe et la sémantique de ces opérateurs dans le cas de l'opérateur +=, celles des autres s'en déduit immédiatement.
expression :
lvalue += expression
lvalue = lvalue + expression