В този урок ще научим за предимството и асоциативността на операторите в C ++ с помощта на примери.
Предимство на операторите на C ++
Ако в един израз има множество оператори, операциите не се оценяват едновременно. По-скоро операторите с по-висок приоритет първо оценяват операциите си.
Нека разгледаме един пример:
int x = 5 - 17 * 6;
Тук операторът за умножение *
е с по-висок приоритет от оператора за изваждане -
. Следователно, 17 * 6
първо се оценява.
В резултат горният израз е еквивалентен на
int x = 5 - (17 * 6);
Ако искаме 5 - 17
първо да оценим , трябва да ги приложим в скоби :
int x = (5 - 17) * 6;
Пример 1: Предимство на операторите
#include using namespace std; int main() ( // evaluates 17 * 6 first int num1 = 5 - 17 * 6; // equivalent expression to num1 int num2 = 5 - (17 * 6); // forcing compiler to evaluate 5 - 17 first int num3 = (5 - 17) * 6; cout << "num1 = " << num1 << endl; cout << "num2 = " << num2 << endl; cout << "num3 = " << num3 << endl; return 0; )
Изход
num1 = -97 num2 = -97 num3 = -72
Забележка: Тъй като в C ++ има много оператори с множество нива на приоритет, силно се препоръчва да използваме скоби, за да направим нашия код по-четлив.
Таблица за предимство на операторите на C ++
Следващата таблица (взета от cppreference.com) показва предимството на операторите C ++. Precedence Level 1 означава оператори с най-висок приоритет, докато Precedence Level 17 означава оператори с най-нисък приоритет.
Свойството на асоциативността ще бъде обсъдено скоро.
Предимство | Оператор | Описание | Асоциативност |
---|---|---|---|
1 | :: | Резолюция на обхвата | Отляво надясно |
2 | а ++ A-- тип () тип () а () а () . -> | Суфикс / постфикс нарастване Суфикс / постфикс намаляване Дефиниране на функция Функция гласове Функция повикване Индекс Достъп на член от обект Достъп на член от обект | Отляво надясно |
3 | ++ a --a + a -a ! ~ (type) * a & sizeof co_await new new () изтриване delete () | Префикс нарастване Префикс декремент Унар плюс Унар минус Логически НЕ Побитово НЕ По бита НЕ Преливане в стил C Индирекция (dereference) Адрес на Размер-на изчакване-израз Динамично разпределение на паметта Динамично освобождаване на паметта | От дясно на ляво |
4 | . * -> * | Избор на обект на член Избор на указател на член | Отляво надясно |
5 | a * b a / b a% b | Модул на деление на умножение | Отляво надясно |
6 | a + b a - b | Добавяне Изваждане | Отляво надясно |
7 | << >> | Побитно ляво преместване Побитно дясно преместване | Отляво надясно |
8 | <= < | Трипосочен оператор за сравнение | Отляво надясно |
9 | < <= > > = | Less than Less than or equal to Greater than Greater than or equal to | Left to Right |
10 | == != | Equal to Not equal to | Left to Right |
11 | & | Bitwise AND | Left to Right |
12 | ^ | Bitwise XOR | Left to Right |
13 | | | Bitwise OR | Left to Right |
14 | && | Logical AND | Left to Right |
15 | || | Logical OR | Left to Right |
16 | a ? b : c throw co_yield = += -= *= /= %= <<= >>= &= ^= |= | Ternary Conditional throw operator yield expression (C++ 20) Assignment Addition Assignment Subtraction Assignment Multiplication Assignment Division Assignment Modulus Assignment Bitwise Shift Left Assignment Bitwise Shift Right Assignment Bitwise AND Assignment Bitwise XOR Assignment Bitwise OR Assignment | Right to Left |
17 | , | Comma operator | Left to Right |
C++ Operators Associativity
Operator associativity is the direction from which an expression is evaluated. For example,
int a = 1; int b = 4; // a will be 4 a = b;
Take a look at a = 4;
statement. The associativity of the =
operator is from right to left. Hence, the value of b is assigned to a, and not in the other direction.
Също така множество оператори могат да имат едно и също ниво на предимство (както виждаме от горната таблица). Когато в израз се използват множество оператори от едно и също ниво на приоритет, те се оценяват според тяхната асоциативност .
int a = 1; int b = 4; b += a -= 6;
И операторите, +=
и -=
операторите имат еднакъв приоритет. Тъй като асоциативността на тези оператори е отдясно наляво, ето как се оценява последното изявление.
a -= 6
се оценява първо. Следователно a ще бъде -5- След това
b += -5
ще бъде оценено. Следователно b ще бъде -1
Пример 2: Асоциативност на операторите
#include using namespace std; int main() ( int a = 1; int b = 4; // a -= 6 is evaluated first b += a -= 6; cout << "a = " << a << endl; ; cout << "b = " << b; )
Изход
a = -5 b = -1