English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
In this tutorial, we will use examples to understand C ++operator precedence and associativity.
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;
#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.
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 | description | associativité |
---|---|---|---|
1 | :: | portée | de gauche à droite |
2 | a++ 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 fonctionindex 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 |
5 | a * b a / b a % b | multiplication division modulo | de gauche à droite |
6 | a + 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érale | de 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 binaire | de gauche à droite |
12 | ^ | xor binaire | de gauche à droite |
13 | | | ou binaire | de gauche à droite |
14 | && | et logique | de gauche à droite |
15 | || | ou logique | de gauche à droite |
16 | a ? 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 virgule | de gauche à droite |
associativitéL'attribut de nature de l'associativité sera discuté plus tard.
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
#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