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








