English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

C++ operator precedence and associativity

In this tutorial, we will use examples to understand C ++operator precedence and associativity.

C ++operator precedence

If there are multiple operators in a single expression, they will not be evaluated simultaneously. Instead, those withhigher precedencethe operator will evaluate its operands first.

Let's look at an example:

int x = 5 - 17 * 6;

In this case, the multiplication operator * has a higher precedence than the subtraction operator - . Therefore,17 * 6evaluate first.

the result, the above expression is equivalent to

int x = 5 - (17 * 6);

if we want to evaluate first5 - 17then they must be placed ininside the parentheses:

int x = (5 - 17) * 6;

Exemple1: operator precedence

#include <iostream>
using namespace std;
int main() {
  // evaluate first17 * 6
  int num1 = 5 - 17 * 6;
  //with num1equivalent expression
  int num2 = 5 - (17 * 6);
  //force the compiler to evaluate first5-17
  int num3 = (5 - 17) * 6;
  cout << "num1 = " << num1 << endl;
  cout << "num2 = " << num2 << endl;
  cout << "num3 = " << num3 << endl;
  return 0;
}

Résultat de la sortie

num1 = -97
num2 = -97
num3 = -72

Attention :En raison de C ++beaucoup d'opérateurs ont plusieurs priorités, donc il est fortement recommandé d'utiliserles parenthèsesrend le code plus lisible.

C ++tableau de priorité des opérateurs

Le tableau suivant montre C ++priorité des opérateurs. Priorité1représente l'opérateur de priorité supérieure, tandis que la priorité17représente l'opérateur d'inférieur priorité.

priorité
opérateur
descriptionassociativité
1::portéede gauche à droite
2a++
a--
type( )
type{ }
a( )
a[ ]
.
->
suffixe/incrémentation suffixée
suffixe/décrémentation suffixée

transformation de style fonction

transformation de style fonction

appels de fonction
index
accès aux membres de l'objet
accès aux membres de l'objet depuis ptr
de gauche à droite
3++a
--a
+a
-a
!
~
(type)
*a
&a
taille
co_await
new new[ ]
delete delete[]
incrémentation préfixée
décrémentation préfixée
positif
négatif
non logique
non binaire
transformation de style C
indirect (déréférencement)
obtenir l'adresse
obtenir la taille
expression await
allocation de la mémoire dynamique
libération de la mémoire dynamique
de droite à gauche
4.*
->*

sélecteur d'objet de membre

sélecteur de pointeur de membre

de gauche à droite
5a * b
a / b
a % b

multiplication

division

modulo

de gauche à droite
6a + b
a - b
addition
soustraction
de gauche à droite
7<<
>>

décalage à gauche binaire

décalage à droite binaire

de gauche à droite
8<=>opérateur de comparaison trilatéralede gauche à droite
9<
<=
>
>=
inférieur
inférieur ou égal
supérieur
supérieur ou égal
de gauche à droite
10==
!=

égal

inégal

de gauche à droite
11&et binairede gauche à droite
12^xor binairede gauche à droite
13|ou binairede gauche à droite
14&&et logiquede gauche à droite
15||ou logiquede gauche à droite
16a ? b : c
throw
co_yield
=
+=
-=
*=
/=
%=
<<=
>>=
&=
^=
|=
opérateur conditionnel ternaire
opérateur throw
expression yield (C++ 20)
affectation
affectation addition
affectation soustraction
affectation multiplication
distribution de la division
affectation modulo
affectation binaire décalage à gauche
affectation binaire décalage à droite
affectation binaire et
affectation binaire xor
affectation binaire ou
de droite à gauche
17,opérateur de virgulede gauche à droite

associativitéL'attribut de nature de l'associativité sera discuté plus tard.

C ++L'associativité des opérateurs

L'associativité des opérateurs est le calcul de l'expressiondirectionPar exemple,

int a = 1;
int b = 4;
// a = 4
a = b;

Voyons a=4statement. L'associativité de l'opérateur d'égalité est de droite à gauche. Par conséquent, la valeur de b est assignée à a.

De même, plusieurs opérateurs peuvent avoir la même priorité (comme indiqué dans le tableau ci-dessus). Lorsqu'il y a plusieurs opérateurs de même priorité dans une expression, ils seront évalués selon leurassociativitéles évaluer.

int a = 1;
int b = 4;
b += a -= 6;

opérateur+et-L'opérateur d'égalité a la même priorité. Étant donné que l'associativité de ces opérateurs est de droite à gauche, c'est la manière d'évaluer la dernière instruction.

  • a -= 6 sera évaluée initialement. Par conséquent, a sera-5

  • Puis, b += -5sera évaluée. Par conséquent, b sera-1

Exemple2:Association des opérateurs

#include <iostream>
using namespace std;
int main() {
  int a = 1;
  int b = 4;
// a -= 6 Évaluation initiale
  b += a -= 6;
  cout << "a = " << a << endl; ;
  cout << "b = " << b;
}

Résultat de la sortie

a = -5
b = -1