Pierwszeństwo i łączność operatorów w języku C #: definicja i przykłady

W tym samouczku nauczysz się pierwszeństwa operatorów i asocjatywności w języku C #. To da nam wyobrażenie o tym, jak wyrażenie jest oceniane przez kompilator C #.

Pierwszeństwo operatora C #

Pierwszeństwo operatorów to zestaw reguł, które definiują sposób oceny wyrażenia. W języku C # każdy operator C # ma przypisany priorytet i na podstawie tych priorytetów jest oceniane wyrażenie.

Na przykład pierwszeństwo (*)operatora mnożenia jest wyższe niż pierwszeństwo (+)operatora dodawania . Dlatego operacja polegająca na mnożeniu jest wykonywana przed dodaniem.

Spójrz na poniższe oświadczenie.

 int x = 4 + 3 * 5;

Jaka będzie wartość x po wykonaniu tej instrukcji?

Operand 3jest powiązany z +i *. Jak wspomniano wcześniej, mnożenie ma wyższy priorytet niż dodawanie. Tak więc operacja 3 * 5jest wykonywana zamiast 4 + 3. Wartość zmiennej x będzie wynosić 19.

Jeśli dodawanie miałoby wyższy priorytet, 4 + 3zostanie oszacowane jako pierwsze, a wartość x będzie 35.

Tabela pierwszeństwa operatorów

Im wyższy priorytet operatora, tym wyższy jest on w tabeli

Pierwszeństwo operatora C #
Kategoria Operatorzy
Przyrost i zmniejszanie przyrostka ++, -
Przedrostek inkrementacja, dekrementacja i jednoargumentowa ++, -, +, -,!, ~
Mnożny *, /,%
Przyłączeniowy +, -
Zmiana <>
Relacyjny <,,> =
Równość ==,! =
Bitowe i &
Bitowe XOR ^
Bitowe OR |
Logiczne AND &&
Logiczne LUB ||
Potrójny ? :
Zadanie =, + =, - =, * =, / =,% =, & =, | =, =, <> =

Operatory przypisania mają najniższy priorytet, podczas gdy operatory przyrostka przyrostka i zmniejszenie mają najwyższy priorytet.

Przykład 1: Pierwszeństwo operatora

 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); ) ) ) 

Kiedy uruchomimy program, wynik będzie:

 19 Fałsz

Rozumiemy, w jaki sposób wyrażenie jest oceniane w programie.

Pierwszeństwo --i ++jest wyższe niż *, a pierwszeństwo *jest wyższe niż -. Stąd oświadczenie,

 wynik1 = --a * b - ++ c;

jest równa

 wynik1 = ((--a) * b) - (++ c);

Wyrażenie w nawiasach jest zawsze oceniane jako pierwsze, bez względu na pierwszeństwo operatorów poza nim.

  • Na początku oceniane jest (--a), w wyniku czego 4.
  • Następnie (++ c) jest oceniane w wyniku 5.
  • Teraz oceniane jest (a * b), w wyniku czego 24.
  • Na koniec przeprowadza się odejmowanie, otrzymując 19.
  • Stąd ostateczna wartość result1 będzie wynosić 19.

W następnym wyrażeniu pierwszeństwo +jest większe niż >=. Zatem c i a są dodawane jako pierwsze, a suma jest porównywana z b, aby otrzymać false.

Asocjatywność operatorów w C #

W poprzedniej sekcji omówiliśmy pierwszeństwo operatorów. Jeśli używane są dwa operatory o różnym priorytecie, operator o wyższym priorytecie jest oceniany jako pierwszy.

Ale co, jeśli obaj operatorzy mają ten sam priorytet?

W takim przypadku wyrażenie jest oceniane na podstawie asocjatywności operatora (od lewej do prawej lub od prawej do lewej).

Na przykład:

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

Tutaj oba *i /mają ten sam priorytet. Ale ponieważ asocjatywność tych operatorów jest od lewej do prawej , a * bjest najpierw obliczana, a następnie przeprowadzany jest podział. Ostatecznym wynikiem tego wyrażenia będzie 10.

W tym konkretnym przykładzie asocjatywność nie ma tak naprawdę znaczenia. Bo nawet gdyby dzielenie zostało przeprowadzone przed pomnożeniem, wynik byłby niezmieniony.

Spójrzmy na inny przykład.

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

Asocjatywność =operatora jest od prawej do lewej . Zatem wartość c (tj. 3) Jest przypisywana b, a następnie wartość b jest przypisywana a. Zatem po wykonaniu tej instrukcji wartości a, b i c będą 3.

Poniższa tabela przedstawia asocjatywność operatorów C #:

Kojarzenie operatorów w języku C #
Kategoria Operatorzy Łączność
Przyrost i zmniejszanie przyrostka ++, - Z lewej na prawą
Przedrostek inkrementacja, dekrementacja i jednoargumentowa ++, -, +, -,!, ~ Od prawej do lewej
Mnożny *, /,% Z lewej na prawą
Przyłączeniowy +, - Z lewej na prawą
Zmiana <> Z lewej na prawą
Relacyjny <,,> = Z lewej na prawą
Równość ==,! = Z lewej na prawą
Bitowe i & Z lewej na prawą
Bitowe XOR ^ Z lewej na prawą
Bitowe OR | Z lewej na prawą
Logiczne AND && Z lewej na prawą
Logiczne LUB || Z lewej na prawą
Potrójny ? : Od prawej do lewej
Zadanie =, + =, - =, * =, / =,% =, & =, | =, =, <> = Od prawej do lewej

Prawie wszyscy operatorzy mają asocjatywność od lewej do prawej. Operatory łączące od prawej do lewej to:

  • Operatory jednoargumentowe
  • Prefiks Operatory inkrementacji i dekrementacji
  • Operator trójskładnikowy
  • Operatory przypisania

Przykład 2: Łączność operatorów

 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); ) ) ) 

Kiedy uruchomimy program, wynik będzie:

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

Interesujące artykuły...