Opérateurs Dart

Les opérateurs sont des symboles qui effectuent des calculs, des comparaisons et des jugements logiques dans les programmes.

Ce chapitre présente systématiquement les différents opérateurs en Dart, notamment les opérateurs arithmétiques, relationnels, logiques, d'affectation, conditionnels et de vérification de type.


Opérateurs arithmétiques

Les opérateurs arithmétiques sont utilisés pour effectuer des opérations mathématiques de base.

Exemple

void main() {
  int a = 10;
  int b = 3;

  print('a = $a, b = $b');
  print('Addition a + b = ${a + b}');    // 13
  print('Soustraction a - b = ${a - b}');    // 7
  print('Multiplication a * b = ${a * b}');    // 30
  print('Division a / b = ${a / b}');    // 3.333... (le résultat est un double)
  print('Division entière a ~/ b = ${a ~/ b}');  // 3 (partie entière, décimale supprimée)
  print('Modulo a % b = ${a % b}');    // 1 (opération modulo)
  print('Négation -a = ${-a}');          // -10 (moins unaire)
}
a = 10, b = 3
加法 a + b = 13
减法 a - b = 7
乘法 a * b = 30
除法 a / b = 3.3333333333333335
整除 a ~/ b = 3
取余 a % b = 1
取反 -a = -10

Remarque : L'opérateur / renvoie toujours un type double, même lorsque les deux opérandes sont de type int et sont divisibles exactement. Si vous n'avez besoin que d'un résultat entier, utilisez l'opérateur de division entière ~/.

Opérateurs d'incrémentation et de décrémentation

Comme la plupart des langages de la famille C, Dart prend en charge ++ (incrémentation) et -- (décrémentation).

Exemple

void main() {
  int count = 0;

  // Préfixe ++ : incrémenter d'abord, puis utiliser
  print('Préfixe ++ : ${++count}');  // 1

  // Postfixe ++ : utiliser d'abord, puis incrémenter
  print('Postfixe ++ : ${count++}');  // 1 (count est encore 1 à ce stade)
  print('Maintenant count = $count');   // 2

  // Idem pour la décrémentation
  print('Préfixe -- : ${--count}');  // 1
  print('Postfixe -- : ${count--}');  // 1
  print('Maintenant count = $count');   // 0
}
前置 ++: 1
后置 ++: 1
现在 count = 2
前置 --: 1
后置 --: 1
现在 count = 0

L'incrémentation et la décrémentation préfixes et postfixes ont le même effet lorsqu'elles sont utilisées seules, mais se comportent différemment dans les expressions. Il est conseillé aux débutants de les éviter autant que possible dans les expressions ; les écrire sur une ligne séparée est plus clair.


Opérateurs relationnels

Les opérateurs relationnels sont utilisés pour comparer deux valeurs, et le résultat est une valeur bool.

OpérateursSignificationExempleRésultat
==equals5 == 5vrai
!=Différent de5 != 3vrai
>supérieur à5 > 3vrai
<inférieur à5 < 3false
>=supérieur ou égal à5 >= 5vrai
<=inférieur ou égal à3 <= 5vrai

Exemple

void main() {
  int exampleScore = 95;
  int passLine = 60;

  print(Score : $exampleScore, Seuil de réussite : $passLine);
  print(Réussi ? ${exampleScore >= passLine});
  print(Score parfait ? ${exampleScore == 100});

  // Les chaînes peuvent aussi être comparées
  String a = 'pomme';
  String b = 'banane';
  print("'$a' == '$b'? ${a == b}");

  // == vérifie si les valeurs sont égales
  String c = 'EXAMPLE';
  String d = 'EXAMPLE';
  print("'$c' == '$d'? ${c == d}");  // true (même contenu)
}
分数: 95, 及格线: 60
及格了吗? true
满分了吗? false
'apple' == 'banana'? false
'EXAMPLE' == 'EXAMPLE'? true

En Dart, == compare si les valeurs de deux objets sont égales, et non leurs adresses de référence. Cela diffère de Java—en Dart, vous n'avez pas besoin d'utiliser la méthode equals() pour comparer des chaînes.


Opérateurs logiques

Les opérateurs logiques servent à combiner plusieurs expressions booléennes, généralement pour des évaluations conditionnelles.

OpérateursSignificationDescription
&&ET logiqueRenvoie true uniquement si les deux côtés sont true.
||OU logiqueRenvoie true si l'un des deux côtés est true.
!NON logiqueNégation : true devient false, false devient true

Exemple

void main() {
  bool isLoggedIn = true;
  bool isAdmin = false;

  // && ET : les deux sont true
  print(Connecté et administrateur : ${isLoggedIn && isAdmin});  // false

  // || OU : au moins l'un est true
  print(Connecté ou administrateur : ${isLoggedIn || isAdmin});  // true

  // ! NOT : négation
  print(Non connecté : ${!isLoggedIn});  // false

  // Évaluation en court-circuit : si le côté gauche détermine déjà le résultat, le côté droit ne s'exécutera pas
  int age = 20;
  // age > 18 est déjà vrai, mais le côté droit doit aussi être vérifié
  print(Adulte et a la permission : ${age >= 18 && isAdmin});

  // age < 18 est déjà faux, donc le côté droit de && est ignoré directement
  print('Mineur et a la permission : ${age < 18 && isAdmin}');
}
登录且是管理员: false
登录或是管理员: true
未登录: false
成年且有权限: false
未成年且有权限: false

Dart utilisel'évaluation en court-circuitPour &&, si le côté gauche est faux, le côté droit n'est pas évalué ; pour ||, si le côté gauche est vrai, le côté droit n'est pas évalué.

Cette fonctionnalité peut être utilisée pour éviter les problèmes de pointeur null.

Exemple

Applications pratiques de l'évaluation en court-circuit :

void main() {
  String? username;

  // Vérification de sécurité : username n'est pas null et la longueur est supérieure à 3
  // Si username est null, le côté droit de && ne s'exécutera pas, évitant ainsi une erreur de pointeur null
  if (username != null && username.length > 3) {
    print('Nom d'utilisateur valide');
  } else {
    print('Nom d'utilisateur invalide ou trop court');
  }
}
Username is invalid or too short.

Opérateurs d'affectation

Vous connaissez déjà l'opérateur d'affectation de base =.

Dart fournit également des opérateurs d'affectation composés pour simplifier les opérations courantes de "calculer puis affecter".

OpérateursSyntaxe équivalenteExemple (lorsque a=10)
+=a = a + ba += 3 → 13
-=a = a - ba -= 3 → 7
*=a = a * ba *= 3 → 30
/=a = a / ba /= 2 → 5.0
~/=a = a ~/ ba ~/= 3 → 3
%=a = a % ba %= 3 → 1

Exemple

void main() {
  int score = 0;

  // Ajouter 10 points pour chaque bonne réponse
  score += 10;
  print('Bonne réponse à la question 1 : $score');

  score += 10;
  print('Bonne réponse à la question 2 : $score');

  // Une mauvaise réponse retire 5 points
  score -= 5;
  print('Réponse incorrecte à 1 question : $score');

  // Doubler le score
  score *= 2;
  print('Récompense doublée : $score');

  print('EXEMPLE score final : $score');
}
答对第1题: 10
答对第2题: 20
答错1题: 15
奖励翻倍: 30
EXAMPLE 最终得分: 30

Opérateurs conditionnels : ?? et ??=

Ces deux opérateurs sont spécialement conçus pour gérer les valeurs null et font partie intégrante du système de null safety de Dart.

?? opérateur de coalescence null

Si l'expression de gauche n'est pas null, retourne sa valeur ; sinon, retourne la valeur de droite.

??= opérateur d'affectation sensible à null

Si la variable est actuellement null, affectez-lui la valeur de droite ; sinon, laissez-la inchangée.

Exemple

void main() {
  // ?? coalescence null
  String? nickname;
  String displayName = nickname ?? 'EXAMPLE user';
  print(displayName);  // EXAMPLE user

  nickname = 'Little R';
  displayName = nickname ?? 'EXAMPLE user';
  print(displayName);  // Little R

  // Le chaînage de ?? fonctionne aussi
  String? a;
  String? b;
  String result = a ?? b ?? 'Default value';
  print(result);  // Default value

  // ??= affectation de coalescence null
  int? count;
  count ??= 0;  // count est null, assigner 0
  print(count);  // 0

  count ??= 100;  // count est déjà 0 (non nul), aucune affectation
  print(count);  // 0 (inchangé)
}
EXAMPLE 用户
小R
默认值
0
0

Opérateur conditionnel ternaire ? :

C'est le seul opérateur à trois opérandes de Dart, une version concise de if-else.

Exemple

void main() {
  int score = 75;

  // Syntaxe : condition ? valeur si vrai : valeur si faux
  String result = score >= 60 ? 'Pass' : 'Fail';
  print('EXEMPLE résultat d'examen : $result');

  // Peut être imbriqué (mais il n'est pas recommandé de dépasser deux niveaux ; la lisibilité se dégradera)
  String grade = score >= 90 ? 'Excellent' : score >= 60 ? 'Réussi' : 'Échoué';
  print('Note : $grade');
}
EXAMPLE 考试结果: 及格
评级: 及格

Opérateurs de vérification de type : is et as

is est utilisé pour vérifier si un objet appartient à un type, as est utilisé pour le transtypage.

Exemple

void main() {
  // is : vérification de type
  var name = 'EXAMPLE';
  print('name est-il de type String ? ${name is String}');   // true
  print('name est-il de type int ? ${name is int}');         // false

  // is! : n’est pas un type
  print('name n’est-il pas de type int ? ${name is! int}');      // true

  // as : conversion de type
  Object obj = 'Bonjour, Dart !';
  // Convertir le type Object en String pour utiliser les méthodes de String
  String str = obj as String;
  print(str.toUpperCase());

  // Vérification de type sécurisée + conversion
  Object maybeString = 42;
  if (maybeString is String) {
    // Dans une branche où la vérification is est vraie, la variable est automatiquement « promue » vers ce type
    print(maybeString.length);  // Aucune conversion avec as nécessaire
  } else {
    print('Pas une chaîne, la valeur est : $maybeString');
  }
}
name 是 String 吗? true
name 是 int 吗? false
name 不是 int 吗? true
HELLO, DART!
不是字符串,值是: 42

Préférez utiliser is pour la vérification de type. Dans une branche conditionnelle où is est évalué à true, Dart promeut automatiquement la variable vers le type cible (Type Promotion), donc il n’est pas nécessaire d’utiliser as pour la conversion de type. N’utilisez as que lorsque vous êtes certain du type mais que le compilateur ne peut pas l’inférer.


Aperçu de la priorité des opérateurs

Lorsqu’une expression contient plusieurs opérateurs, Dart les évalue par ordre de priorité, du plus élevé au plus faible.

Si vous n’êtes pas sûr de la priorité, la pratique la plus sûre est deutiliser des parenthèses pour clarifier l’ordre de calcul。

PrioritéOpérateursDescription
Maximale() [] . ?.Parenthèses, indices, accès aux membres
! ~ - ++ --Opérateurs unaires
* / % ~/Multiplication, division et reste
+ -Additif
< <= > >=Comparaison relationnelle
== !=Vérification d’égalité
&&ET logique
||OU logique
??Coalescence nulle
? :Conditionnel ternaire
= += -= *= etc.Affectation (priorité la plus faible)

Exemple

void main() {
  // Ne vous fiez pas à la priorité—utilisez des parenthèses pour clarifier votre intention.
  int result = ((10 + 5) * 2) - (8 ~/ 3);
  print('Résultat du calcul : $result');  // 28

  // Sans parenthèses, le résultat peut être complètement différent.
  // 10 + 5 * 2 - 8 ~/ 3 sera 18 (multiplication et division avant addition et soustraction)
  int result2 = 10 + 5 * 2 - 8 ~/ 3;
  print('Sans parenthèses : $result2');  // 18
}
计算结果: 28
不加括号: 18
autres extensions