Предимство и асоциативност на оператора C ++

В този урок ще научим за предимството и асоциативността на операторите в 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

Интересни статии...