Les opérateurs sont les symboles fondamentaux qui indiquent au processeur quelles transformations et calculs appliquer sur les données stockées dans vos variables. En langage C, les opérateurs se classent en plusieurs familles : arithmétiques, relationnels, logiques et d'affectation.
Cette leçon décortique leur fonctionnement et met en garde contre les pièges classiques, notamment la division entière et la priorité des opérations.
1. Les opérateurs arithmétiques#
Le langage C dispose des cinq opérations arithmétiques de base :
| Opérateur | Signification | Exemple | Résultat |
|---|---|---|---|
+ |
Addition | 7 + 3 |
10 |
- |
Soustraction | 10 - 4 |
6 |
* |
Multiplication | 6 * 7 |
42 |
/ |
Division | 14 / 2 |
7 |
% |
Modulo (reste de la division entière) | 17 % 5 |
2 (car \(17 = 3 \times 5 + 2\)) |
[!NOTE] L'opérateur modulo
%ne s'applique qu'exclusivement aux nombres entiers (int,char,long). Tenter d'effectuer7.5 % 2provoquera une erreur de compilation.
2. Le piège majeur de la division entière en C#
En langage C, lorsque les deux opérandes d'une division sont de type entier, le compilateur applique obligatoirement une division entière en tronquant brutalement la partie décimale :
Pourquoi ? Parce que l'expression a / b est d'abord évaluée entre deux entiers, produisant l'entier 2. Ce n'est qu'ensuite que cette valeur 2 est convertie en flottant 2.0 pour être stockée dans resultat.
La solution : Le transtypage explicite (Cast)#
Pour forcer une division réelle à virgule, au moins l'un des deux opérandes doit être un nombre à virgule flottante :
// Méthode 1 : Transtypage explicite (Cast)
float resultat = (float)a / b; // Résultat : 2.500000
// Méthode 2 : Utiliser un littéral flottant
float moyenne = (note1 + note2) / 2.0f;
3. Incrémentation et Décrémentation (++ et --)#
Pour ajouter ou soustraire 1 à une variable, le C propose une syntaxe concise :
i++(Post-incrémentation) : utilise d'abord la valeur courante dei, puis incrémenteide 1.++i(Pré-incrémentation) : incrémente d'abordide 1, puis utilise la nouvelle valeur.
#include <stdio.h>
int main(void)
{
int x = 5;
int y = x++; // y reçoit 5, puis x devient 6
int a = 5;
int b = ++a; // a devient 6, puis b reçoit 6
printf("Post-incrementation : x = %d, y = %d\n", x, y);
printf("Pre-incrementation : a = %d, b = %d\n", a, b);
return 0;
}
4. Opérateurs d'affectation combinée#
Le C permet de combiner une opération arithmétique et une affectation en un seul symbole :
score += 10;\(\Longleftrightarrow\)score = score + 10;prix *= 1.20;\(\Longleftrightarrow\)prix = prix * 1.20;solde -= retrait;\(\Longleftrightarrow\)solde = solde - retrait;valeur %= 2;\(\Longleftrightarrow\)valeur = valeur % 2;
5. Opérateurs relationnels et logiques#
Ces opérateurs sont la clé des structures conditionnelles (if) et des boucles (while) :
Opérateurs de comparaison (Relationnels)#
| Symbole | Signification | Exemple vrai | Exemple faux |
|---|---|---|---|
== |
Égal à | 5 == 5 |
5 == 6 |
!= |
Différent de | 5 != 6 |
5 != 5 |
< |
Strictement inférieur | 3 < 7 |
7 < 3 |
> |
Strictement supérieur | 8 > 2 |
2 > 8 |
<= |
Inférieur ou égal | 5 <= 5 |
6 <= 5 |
>= |
Supérieur ou égal | 5 >= 5 |
4 >= 5 |
[!WARNING] Ne confondez jamais
=(affectation d'une valeur) et==(test d'égalité). Écrireif (note = 20)écrase la valeur de la note à 20 et renvoie toujours vrai !
Opérateurs logiques booléens#
&&(ET logique) : Vrai uniquement si toutes les conditions sont vraies.||(OU logique) : Vrai si au moins une des conditions est vraie.!(NON logique) : Inverse l'état logique (!truedonnefalse).
// Éligible si l'étudiant a plus de 18 ans ET une moyenne >= 10
if (age >= 18 && moyenne >= 10.0f)
{
printf("Candidature validee.\n");
}
6. Mise en pratique : Analyseur de nombre entier#
Énoncé :
Écrivez un programme qui demande à l'utilisateur de saisir un nombre entier. Le programme doit déterminer et afficher :
1. Si le nombre est pair ou impair (à l'aide du modulo %).
2. Si le nombre est positif, négatif ou nul.
??? tip "Solution complète"
#include <stdio.h>
int main(void)
{
int nombre = 0;
printf("Entrez un nombre entier relatif : ");
if (scanf("%d", &nombre) != 1)
{
printf("Erreur de saisie.\n");
return 1;
}
// 1. Test de parité
if (nombre % 2 == 0)
{
printf("Le nombre %d est PAIR.\n", nombre);
}
else
{
printf("Le nombre %d est IMPAIR.\n", nombre);
}
// 2. Test de signe
if (nombre > 0)
{
printf("Le nombre %d est STRICTEMENT POSITIF.\n", nombre);
}
else if (nombre < 0)
{
printf("Le nombre %d est STRICTEMENT NEGATIF.\n", nombre);
}
else
{
printf("Le nombre saisi est NUL (egal a zero).\n");
}
return 0;
}
Vous dominez désormais les calculs et comparaisons. Passons aux structures de répétition avec les boucles for, while et do ... while.
Commentaires