Espaces de noms
Variantes
Affichages
Actions

Priorité des opérateurs en C++

De cppreference.com
< cpp‎ | language
 
 
Langage C++
Sujets généraux
Contrôle de flux
Instructions conditionnelles
Instructions d'itération
Instructions de saut
Fonctions
déclaration de fonction
expression lambda
fonction générique
spécificateur inline
spécification d'exception (obsolète)
spécificateur noexcept (C++11)
Exceptions
Espaces de noms
Types
spécificateur decltype (C++11)
Qualificatifs
qualificatifs const et volatile
qualificatifs de stockage
qualificatif constexpr (C++11)
qualificatif auto (C++11)
qualificatif alignas (C++11)
Initialisation
Littéraux
Expressions
opérateurs
priorité des opérateurs
opérateurs alternatifs
Utilitaires
Types
déclaration typedef
déclaration d'alias de type (C++11)
attributs (C++11)
Jette
Original:
Casts
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
conversions implicites
conversion const_cast
conversion static_cast
conversion dynamic_cast
conversion reinterpret_cast
conversions style C et style fonction
Allocation de mémoire
Classes
Qualificatifs spécifiques aux membres de classe
Fonctions membres spéciales
Modèles
classes génériques
fonctions génériques
spécialisation de modèles
paquets de paramètres (C++11)
Divers
Assembleur
 

Le tableau suivant liste la priorité et l'associativité des opérateurs C++. Les opérateurs sont triés par ordre décroissant de priorité.

Priorité Opérateur Description Associativité
1 :: Résolution de portée Gauche à droite
2 ++   -- Incrémentation et décrementation suffixe/postfixe
() Appel de fonction
[] Accès dans un tableau
. Sélection membre par référence
−> Sélection membre par pointeur
3 ++   -- Incrementation et décrementation préfixe Droite à gauche
+   Plus et moins unaires
!   ~ NON logique et NON binaire
(type) Transtypage
* Indirection (déréférence)
& Adresse
sizeof Taille
new, new[] Allocation dynamique de la mémoire
delete, delete[] Libération dynamique de la mémoire
4 .*   ->* Pointeur vers un membre Gauche à droite
5 *   /   % Multiplication, division et reste
6 +   Addition et soustraction
7 <<   >> Décalage binaire à gauche et à droite
8 <   <= Respectivement pour les opérateurs de comparaison < et ≤
>   >= Respectivement pour les opérateurs de comparaison > et ≥
9 ==   != Respectivement pour les comparaisons = et ≠
10 & ET binaire
11 ^ XOR binaire (ou exclusif)
12 | OU binaire (ou inclusif)
13 && ET logique
14 || OU logique
15 ?: opérateur conditionnel ternaire Droite à gauche
= Affectation directe (fourni par défaut pour les classes C++)
+=   −= Affectation par somme ou différence
*=   /=   %= Affectation par produit, division ou reste
<<=   >>= Affectation par décalage binaire à gauche ou à droite
&=   ^=   |= Affectation par ET, XOR ou OU binaire
16 throw opérateur Throw (pour les exceptions)
17 , Virgule Gauche à droite

Lors de l'analyse d'une expression, un opérateur qui figure sur une lignes sera plus étroitement lié (comme s'il y avait des parenthèses) à ses arguments que tous les autres opérateurs listés dans les lignes en dessous. Par exemple, les expressions std::cout<<a&b et *p++ sont analysées comme (std::cout<<a)&b et *(p++) et non pas comme std::cout<<(a&b) ou (*p)++.

Les opérateurs placés dans la même cellule (il peut y avoir plusieurs lignes d'opérateurs répertoriés dans une cellule) sont évaluées avec le même niveau de priorité, selon le sens de lecture indiqué dans la dernière colonne. Par exemple, l'expression a=b=c est analysée comme a=(b=c) et non pas comme (a=b)=c, en raison de l'associativité de droite à gauche.

La priorité d'un opérateur n'est pas affectée par la surcharge.

[modifier] Notes

La norme elle-même ne précise pas les niveaux de priorité. Ils sont issus de la grammaire.

Les opérateurs const_cast, static_cast, dynamic_cast, reinterpret_cast et typeid ne sont pas inclus car ils ne sont jamais ambiguës.


Certains opérateurs ont des variantes d'écriture (par exemple, and pour &&, or pour ||, not pour !, etc).

[modifier] Voir aussi

L'ordre d'évaluation des arguments des opérateurs lors de l'exécution.

Opérateurs ordinaires
affectation incrémentation
décrémentation
arithmétique logique comparaison accès aux membre autre

a = b
a = rvalue
a += b
a -= b
a *= b
a /= b
a %= b
a &= b
a |= b
a ^= b
a <<= b
a >>= b

++a
--a
a++
a--

+a
-a
a + b
a - b
a * b
a / b
a % b
~a
a & b
a | b
a ^ b
a << b
a >> b

!a
a && b
a || b

a == b
a != b
a < b
a > b
a <= b
a >= b

a[b]
*a
&a
a->b
a.b
a->*b
a.*b

a(...)
a, b
(type) a
? :

Opérateurs spéciaux

static_cast convertit un type dans un autre type compatible

dynamic_cast convertit une classe de base virtuelle dans une classe dérivée

const_cast convertit un type dans un type compatible avec des cv-qualifiers différents

reinterpret_cast convertit un type dans un type incompatibles

new allocation de la mémoire

delete libère de la mémoire

sizeof récupère la taille d'un type

sizeof... récupère la taille d'un paquet de paramètres (depuis C++11)

typeid récupère les informations de type d'un type

noexcept vérifie si une expression peut lancer une exception (depuis C++11)

alignof récupère les conditions d'alignement d'un type (depuis C++11)