les opérateurs en C

27 Aug 2019 27 Aug 2019 19461 vues ESSADDOUKI Mostafa 7 min de lecture

Les opérateurs en langage C

Les opérateurs sont les symboles qui permettent d'effectuer des opérations sur des opérandes (variables ou valeurs). Le C dispose d'un ensemble riche d'opérateurs couvrant les calculs arithmétiques, les comparaisons, la logique, les manipulations de bits et plus encore.

Définition — Opérateur Un opérateur est un symbole qui indique au compilateur d'effectuer une opération spécifique sur un ou plusieurs opérandes. On distingue les opérateurs unaires (un seul opérande, ex. ++x), binaires (deux opérandes, ex. a + b) et ternaires (trois opérandes, ex. a ? b : c).
CatégorieOpérateursExemple
Arithmétiques+ - * / % ++ --a + b, x++
Relationnels== != > < >= <=a > b
Logiques&& || !a && b
Binaires (bits)& | ^ ~ << >>a & b, x << 2
Affectation= += -= *= /= %=a += 5
Divers?: , sizeof & * ->sizeof(int)

1. Opérateurs arithmétiques

a. Opérateurs binaires

OpérateurNomExemple (a=10, b=4)Résultat
+Additiona + b14
-Soustractiona - b6
*Multiplicationa * b40
/Division entièrea / b2 (partie entière)
%Modulo (reste)a % b2

Exemple n°1 — Opérateurs arithmétiques binaires

#include <stdio.h>

int main(void)
{
    int a = 10, b = 4, res;

    res = a + b;  printf("a+b     = %d\n", res);   /* 14 */
    res = a - b;  printf("a-b     = %d\n", res);   /*  6 */
    res = a * b;  printf("a*b     = %d\n", res);   /* 40 */
    res = a / b;  printf("a/b     = %d\n", res);   /*  2 — division entière */
    res = a % b;  printf("a mod b = %d\n", res);   /*  2 — reste */

    return 0;
}
Sortie
a+b     = 14
a-b     = 6
a*b     = 40
a/b     = 2
a mod b = 2
Attention — Division entière et division réelle En C, la division entre deux entiers donne un entier (partie entière tronquée). Pour obtenir un résultat réel, au moins un des opérandes doit être de type float ou double:
int   r1 = 10 / 4;        /* r1 = 2   — division entière    */
float r2 = 10.0 / 4;     /* r2 = 2.5 — division réelle     */
float r3 = (float)10 / 4; /* r3 = 2.5 — cast explicite      */

b. Opérateurs d'incrémentation et décrémentation

Les opérateurs ++ et -- modifient la valeur d'une variable de 1. Leur position (préfixe ou suffixe) détermine le moment de la modification.

OpérateurNomComportementExemple (a=10)resa après
a++Post-incrémentationUtilise a puis incrémenteres = a++1011
++aPré-incrémentationIncrémente puis utilise ares = ++a1111
a--Post-décrémentationUtilise a puis décrémenteres = a--109
--aPré-décrémentationDécrémente puis utilise ares = --a99

Exemple n°2 — Incrémentation et décrémentation

#include <stdio.h>

int main(void)
{
    int a = 10, res;

    /* Post-incrémentation : res reçoit l'ancienne valeur (10), puis a devient 11 */
    res = a++;
    printf("post++ : a = %d, res = %d\n", a, res);   /* a=11, res=10 */

    /* Post-décrémentation : res reçoit 11, puis a devient 10 */
    res = a--;
    printf("post-- : a = %d, res = %d\n", a, res);   /* a=10, res=11 */

    /* Pré-incrémentation : a devient 11, res reçoit la nouvelle valeur */
    res = ++a;
    printf("pre++  : a = %d, res = %d\n", a, res);   /* a=11, res=11 */

    /* Pré-décrémentation : a devient 10, res reçoit la nouvelle valeur */
    res = --a;
    printf("pre--  : a = %d, res = %d\n", a, res);   /* a=10, res=10 */

    return 0;
}
Sortie
post++ : a = 11, res = 10
post-- : a = 10, res = 11
pre++  : a = 11, res = 11
pre--  : a = 10, res = 10

2. Opérateurs relationnels

Les opérateurs relationnels comparent deux valeurs et retournent 1 (vrai) ou 0 (faux) en C.

OpérateurSignificationExemple (a=10, b=4)Résultat
==Égal àa == b0 (faux)
!=Différent dea != b1 (vrai)
>Supérieur àa > b1 (vrai)
<Inférieur àa < b0 (faux)
>=Supérieur ou égala >= b1 (vrai)
<=Inférieur ou égala <= b0 (faux)

Exemple n°3 — Opérateurs relationnels

#include <stdio.h>

int main(void)
{
    int a = 10, b = 4;

    printf("a >  b : %d\n", a >  b);   /* 1 */
    printf("a >= b : %d\n", a >= b);   /* 1 */
    printf("a <  b : %d\n", a <  b);   /* 0 */
    printf("a <= b : %d\n", a <= b);   /* 0 */
    printf("a == b : %d\n", a == b);   /* 0 */
    printf("a != b : %d\n", a != b);   /* 1 */

    return 0;
}
Sortie
a >  b : 1
a >= b : 1
a <  b : 0
a <= b : 0
a == b : 0
a != b : 1
Danger — Confondre = et == = est l'affectation, == est la comparaison. Écrire =dans une condition effectue une affectation et retourne la valeur affectée — ce qui est souvent vrai (non nul) :
/* Incorrect — affecte 5 à a, condition toujours vraie */
if (a = 5)
    printf("toujours exécuté\n");

/* Correct — compare a à 5 */
if (a == 5)
    printf("exécuté si a vaut 5\n");

3. Opérateurs logiques

Les opérateurs logiques combinent des conditions booléennes. En C, toute valeur non nulle est vraie, zéro est faux.

OpérateurNomRésultat vrai si…Table de vérité (résumé)
&&ET logiqueLes deux opérandes sont vraisV && V → V ; sinon → F
||OU logiqueAu moins un opérande est vraiF || F → F ; sinon → V
!NON logiqueL'opérande est faux!0 → 1 ; !non-nul → 0

Exemple n°4 — Opérateurs logiques

#include <stdio.h>

int main(void)
{
    int a = 10, b = 4, c = 10, d = 20;

    /* ET logique — les DEUX conditions doivent être vraies */
    if (a > b && c == d)
        printf("ET : a>b ET c==d\n");
    else
        printf("ET : condition non satisfaite\n");   /* c != d */

    /* OU logique — au moins UNE condition suffit */
    if (a > b || c == d)
        printf("OU : a>b OU c==d\n");   /* a > b est vraie */
    else
        printf("OU : aucune condition satisfaite\n");

    /* NON logique — inverse la valeur de vérité */
    if (!a)
        printf("NON : a est zéro\n");
    else
        printf("NON : a est différent de zéro\n");   /* a=10 ≠ 0 */

    return 0;
}
Sortie
ET : condition non satisfaite
OU : a>b OU c==d
NON : a est différent de zéro
Évaluation en court-circuit (short-circuit evaluation) En C, les opérateurs && et ||évaluent les opérandes de gauche à droite et s'arrêtent dès que le résultat est déterminé :
  • A && B : si A est faux, B n'est pas évalué
  • A || B : si A est vrai, B n'est pas évalué
Cela permet d'écrire des gardes sûres comme :
if (ptr != NULL && ptr->valeur > 0)
    printf("%d\n", ptr->valeur);
/* Si ptr == NULL, ptr->valeur n'est jamais évalué */

Récapitulatif

CatégorieOpérateurs clésRetournePiège courant
Arithmétiques binaires+ - * / %Valeur numérique10/4 = 2 (division entière)
Pré-incrémentation++x, --xNouvelle valeurModifie avant utilisation
Post-incrémentationx++, x--Ancienne valeurModifie après utilisation
Relationnels== != > < >= <=0 ou 1Confondre = et ==
ET logique&&0 ou 1Court-circuit — 2e opérande non évalué si 1er faux
OU logique||0 ou 1Court-circuit — 2e opérande non évalué si 1er vrai
NON logique!0 ou 1!0 = 1, !non-nul = 0

Discussion (0)

Soyez le premier à laisser un commentaire !

Laisser un commentaire

Votre commentaire sera visible après modération.