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 3
jest powiązany z +
i *
. Jak wspomniano wcześniej, mnożenie ma wyższy priorytet niż dodawanie. Tak więc operacja 3 * 5
jest wykonywana zamiast 4 + 3
. Wartość zmiennej x będzie wynosić 19
.
Jeśli dodawanie miałoby wyższy priorytet, 4 + 3
zostanie 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 * b
jest 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