Menu

Les opérateurs en Java : arithmétiques, de comparaison, logiques et d'affectation

Comment fonctionnent les opérateurs Java - arithmétiques, de comparaison, logiques, d'affectation, d'incrémentation et l'opérateur ternaire - ainsi que la division entière, la priorité et les pièges qui surprennent les débutants.

Cette page contient des éditeurs exécutables - modifiez, exécutez et voyez la sortie instantanément.

À quoi servent les opérateurs

Les opérateurs sont les symboles qui combinent des valeurs pour en calculer de nouvelles. Vous les utilisez déjà de façon informelle - + additionne, > compare - et Java les regroupe en quelques familles : arithmétiques, de comparaison, logiques, d'affectation, plus quelques cas spéciaux comme l'incrémentation et le ternaire.

La plupart des opérateurs prennent deux valeurs (une avant, une après le symbole) et produisent un résultat. Toute la subtilité consiste à savoir de quel type est ce résultat et dans quel ordre ils s'appliquent - c'est là que les débutants trébuchent.

Les opérateurs arithmétiques

Les cinq opérateurs arithmétiques travaillent sur des nombres : +, -, *, / et % (reste).

L'opérateur % est le reste après la division : 17 % 5 vaut 2 parce que 5 entre trois fois dans 17 en laissant 2. C'est l'outil quotidien pour tester la divisibilité - n % 2 == 0 est le test standard « n est-il pair ? ».

Notez aussi que + joue un double rôle : avec des nombres il additionne, mais avec une String d'un côté ou de l'autre il assemble du texte.

La première ligne se lit de gauche à droite : "Total: " + 3 est déjà une chaîne, donc le 4 est ajouté comme texte. Encadrez le calcul de parenthèses quand vous voulez qu'il soit effectué en premier.

Le piège de la division entière

C'est la surprise la plus fréquente de toutes. Quand les deux opérandes de / sont des entiers, Java effectue une division entière et écarte la fraction - il n'arrondit pas, il tronque vers zéro.

Pour obtenir un résultat décimal, faites en sorte qu'au moins un opérande soit un double - écrivez-le avec un .0, ou convertissez un côté avec (double). Faire (double)(5 / 2) n'aide pas, car la division entière 5 / 2 a déjà eu lieu avant la conversion ; vous devez convertir un opérande, pas le résultat.

Les opérateurs de comparaison

Les opérateurs de comparaison posent une question oui/non et renvoient un boolean. Il y en a six : ==, !=, <, >, <=, >=.

Attention à la différence entre = (affectation - « mets cette valeur ici ») et == (comparaison - « sont-ils égaux ? »). Les confondre est un bug classique.

Une mise en garde importante : == compare les références d'objets, pas les contenus. Pour les chaînes, utilisez .equals().

Utilisez == pour les types primitifs comme int et boolean, et .equals() chaque fois que vous comparez le contenu d'objets tels que String.

Les opérateurs logiques

Les opérateurs logiques combinent des valeurs booléennes : && (et), || (ou) et ! (non). C'est ainsi que vous exprimez des conditions comme « assez âgé et a un billet ».

&& et || font un court-circuit : Java arrête d'évaluer dès que la réponse est certaine. Avec &&, si le côté gauche est false, le côté droit n'est jamais vérifié ; avec ||, si le côté gauche est true, le côté droit est ignoré. Ce n'est pas qu'une optimisation - vous pouvez vous en servir pour la sécurité :

if (text != null && text.length() > 0) { ... }

Si text est null, le côté gauche est false et text.length() n'est jamais appelé, ce qui évite une NullPointerException. Inversez l'ordre et le programme planterait.

Affectation et incrémentation

= affecte, mais Java possède aussi des affectations composées qui combinent une opération et une affectation : +=, -=, *=, /=, %=. Et ++ / -- ajoutent ou retranchent un.

++ existe en deux variantes : postfixée (count++) renvoie l'ancienne valeur puis incrémente ; préfixée (++count) incrémente d'abord puis renvoie la nouvelle valeur. La différence ne compte que lorsque vous utilisez le résultat dans la même expression :

Quand ++ est seul sur sa ligne, postfixé ou préfixé ne change rien - préférez donc celui qui se lit le plus clairement et n'entassez pas d'incrémentations dans des expressions plus grandes.

L'opérateur ternaire

Le ternaire condition ? a : b est un if/else compact qui produit une valeur : si la condition est true il vaut a, sinon b.

Il brille pour les affectations courtes de type ceci-ou-cela. Résistez à la tentation d'imbriquer des ternaires dans des ternaires - cela devient vite illisible, et un simple if/else est plus clair.

Priorité et parenthèses

Les opérateurs s'appliquent dans un ordre fixe, un peu comme en mathématiques : *, /, % se lient plus fort que + et -, qui se lient plus fort que les comparaisons, qui se lient plus fort que &&, puis ||.

Vous n'avez pas besoin de mémoriser le tableau complet. Quand une expression mélange des familles ou que vous devez vous arrêter pour deviner l'ordre, ajoutez des parenthèses - elles ne coûtent rien et rendent l'intention évidente pour le prochain lecteur.

Ensuite : la conversion de type (casting)

Plusieurs pièges vus ici - la division entière, le mélange de int et de double - se ramènent aux types. Convertir délibérément entre types numériques s'appelle le casting, et c'est le sujet de la page suivante.

Questions fréquentes

Que fait l'opérateur % en Java ?

% est l'opérateur de reste (modulo) - il donne ce qui reste après une division entière. 7 % 3 vaut 1, et 10 % 2 vaut 0. C'est la façon standard de tester la divisibilité (n % 2 == 0 signifie que n est pair) et de ramener une valeur dans une plage.

Pourquoi 5 / 2 donne-t-il 2 en Java au lieu de 2.5 ?

Quand les deux opérandes sont des entiers, / effectue une division entière et jette la partie fractionnaire - donc 5 / 2 vaut 2, pas 2.5. Pour obtenir 2.5, il faut qu'au moins un opérande soit un double : écrivez 5.0 / 2, 5 / 2.0, ou convertissez un côté avec (double) 5 / 2.

Quelle est la différence entre == et equals() en Java ?

== compare les types primitifs par valeur, mais pour les objets (y compris String) il compare les références - s'il s'agit du même objet en mémoire. Pour comparer le contenu des objets, utilisez .equals(). Comparer deux chaînes avec == peut renvoyer false même quand le texte correspond, alors utilisez toujours "a".equals(b) pour les chaînes.

Coddy programming languages illustration

Apprendre à coder avec Coddy

COMMENCER