C # Предимство и асоциативност на операторите: Определение и примери

В този урок ще научите за приоритета на оператора и асоциативността в C #. Това ще ни даде представа за това как изразът се оценява от компилатора C #.

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

Приоритетът на оператора е набор от правила, който определя как се оценява изразът. В C # всеки оператор C # има присвоен приоритет и въз основа на тези приоритети изразът се оценява.

Например приоритетът на (*)оператора за умножение е по-висок от предимството на (+)оператора за събиране . Следователно операция, включваща умножение, се извършва преди събиране.

Погледнете изявлението по-долу.

 int x = 4 + 3 * 5;

Каква ще е стойността на x след изпълнението на този оператор?

Операндът 3е свързан с +и *. Както беше посочено по-рано, умножението има по-голям приоритет от събирането. И така, операцията 3 * 5се извършва вместо 4 + 3. Стойността на променлива x ще бъде 19.

Ако добавянето ще има по-висок приоритет, първо 4 + 3ще бъде оценено и стойността на x ще бъде 35.

Таблица за предимство на оператора

Колкото по-висок е приоритетът на оператора, толкова по-висок е той в таблицата

Предимство на оператора C #
Категория Оператори
Увеличаване и намаляване на Postfix ++, -
Префикс Increment, Decrement и Unary ++, -, +, -,!, ~
Мултипликативни *, /,%
Добавка +, -
Shift <>
Релационна <,,> =
Равенство ==,! =
Побитово И &
Побитово XOR ^
Побитово ИЛИ |
Логично И &&
Логично ИЛИ ||
Тройка ? :
Възлагане =, + =, - =, * =, / =,% =, & =, | =, =, <> =

Операторите за присвояване имат най-нисък приоритет, докато операторите за увеличаване и намаляване на постфикса имат най-висок приоритет.

Пример 1: Предимство на оператора

 using System; namespace Operator ( class OperatorPrecedence ( public static void Main(string() args) ( int result1; int a = 5, b = 6, c = 4; result1 = --a * b - ++c; Console.WriteLine(result1); bool result2; result2 = b>= c + a; Console.WriteLine(result2); ) ) ) 

Когато стартираме програмата, изходът ще бъде:

 19 Невярно

Нека разберем как се оценява изразът в програмата.

Предимството на --и ++е по-високо от *и предимството на *е по-високо от -. Следователно твърдението,

 резултат1 = --a * b - ++ c;

е еквивалентно на

 резултат1 = ((--a) * b) - (++ c);

Изразът в скобите винаги се оценява първо, независимо какъв е приоритетът на операторите извън него.

  • Отначало се оценява (--a) в резултат на 4.
  • След това (++ c) се изчислява в резултат на 5.
  • Сега, (a * b) се оценява в резултат на 24.
  • И накрая, изваждането се извършва в резултат на 19.
  • Следователно крайната стойност на result1 ще бъде 19.

В следващия израз предимството на +е по-високо от >=. И така, c и a се добавят първо и сумата се сравнява с b, за да се получи false.

Асоциативност на операторите в C #

В предишния раздел обсъдихме предимството на оператора. Ако се използват два оператора с различен приоритет, първо се оценява операторът с по-висок приоритет.

But what if both the operators have same precedence?

In such case, the expression is evaluated based on the associativity of operator (left to right or right to left).

For example:

 int a = 5, b = 6, c = 3; int result = a * b / c;

Here, both * and / have the same precedence. But since the associativity of these operators is from left to right, a * b is evaluated first and then division is carried out. The final result of this expression will be 10.

In this particular example, the associativity does not really matter. Because even if division was carried out before multiplication, the result would be unaffected.

Let's take a look at another example.

 int a = 5, b = 6, c = 3; a = b = c;

Асоциативността на =оператора е отдясно наляво . Така че стойността на c (т.е. 3) се присвоява на b и след това стойността на b се присвоява на a. Така че след изпълнението на това изявление стойностите на a, b и c ще бъдат 3.

Таблицата по-долу показва асоциативността на операторите C #:

C # Асоциативност на операторите
Категория Оператори Асоциативност
Увеличаване и намаляване на Postfix ++, - Отляво надясно
Префикс Increment, Decrement и Unary ++, -, +, -,!, ~ От дясно на ляво
Мултипликативни *, /,% Отляво надясно
Добавка +, - Отляво надясно
Shift <> Отляво надясно
Релационна <,,> = Отляво надясно
Равенство ==,! = Отляво надясно
Побитово И & Отляво надясно
Побитово XOR ^ Отляво надясно
Побитово ИЛИ | Отляво надясно
Логично И && Отляво надясно
Логично ИЛИ || Отляво надясно
Тройка ? : От дясно на ляво
Възлагане =, + =, - =, * =, / =,% =, & =, | =, =, <> = От дясно на ляво

Почти всички оператори имат асоциативност отляво надясно. Операторите с асоциативност отдясно наляво са:

  • Унарни оператори
  • Оператори за инкремент и декремент на префикс
  • Троичен оператор
  • Оператори за присвояване

Пример 2: Асоциативност на операторите

 using System; namespace Operator ( class OperatorPrecedence ( public static void Main(string() args) ( int a = 5, b = 6, c = 3; int result = a * b / c; Console.WriteLine(result); a = b = c; Console.WriteLine("a = (0), b = (1), c = (2)", a, b, c); ) ) ) 

Когато стартираме програмата, изходът ще бъде:

 10 a = 3, b = 3, c = 3

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