Szybkie pierwszeństwo i skojarzenie operatorów (z przykładami)

W tym artykule poznasz reguły używane do obliczania wyrażenia za pomocą operatorów i operandów.

Szybkie pierwszeństwo operatora

Pierwszeństwo operatorów to zbiór reguł używanych do oceny danego wyrażenia matematycznego. Gdy w jednym wyrażeniu jest używanych kilka operatorów, każda część jest oceniana w określonej kolejności nazywanej priorytetem operatorów. Niektóre operatory mają wyższy priorytet niż inne, co wpływa na sposób oceny wyrażenia.

Tabela pierwszeństwa operatorów

W poniższej tabeli przedstawiono pierwszeństwo operatorów w języku Swift. Im wyższa pozycja w tabeli, tym wyższy jej priorytet.

Swift Standard Library Precedence Groups (od najwyższego do najniższego)
Grupy operatorów Przykłady
Pierwszeństwo przesunięcia bitowego >> & <>>>
Pierwszeństwo mnożenia & *% & * /
Dodatkowe pierwszeństwo | & + & - + - ^
Pierwszeństwo formowania zakresu … <…
Casting Precedence jest jak
Priorytet zerowej koalescencji ??
Pierwszeństwo porównania ! => = <= === ==
Pierwszeństwo koniunkcji logicznej &&
Logiczne pierwszeństwo dysjunkcji ||
Domyślne pierwszeństwo ~>
Pierwszeństwo trójskładnikowe ?:
Funkcja Pierwszeństwo strzałek ()
Pierwszeństwo przypisania | =% = / = & <> = & = * = >> = << = = + = - =

Przykład 1: Szybkie pierwszeństwo operatora

 let x = 4 + 5 * 5 print(x) 

Po uruchomieniu powyższego programu wynik będzie:

 29

W powyższym przykładzie, jeśli czytasz wyrażenie od lewej do prawej, możesz oczekiwać, że wynik będzie równy 45. Ale operator mnożenia ma wyższy priorytet niż operator dodawania, więc wyrażenie 4 + 5 * 5 jest oceniane jako 4 + (5 * 5). Dlatego print(x)wyświetla 29 na ekranie.

Kroki wykonania
Kroki Operator Wyrażenie Wartość zwrócona z wyrażenia
1 * 5 * 5 25
2 + 4 + 25 29
3 = drukuj (x) 29

Przykład 2: Swift Operator Precedence ze złożonym operatorem przypisania

 var y = 15 y += 10 - 2 * 3 print(y) 

Po uruchomieniu powyższego programu wynik będzie:

 19

W powyższym przykładzie wyrażenie var y = 15przypisuje wartość 15 w zmiennej y.

W następnym wyrażeniu y += 10 - 2 * 3operator mnożenia ma wyższy priorytet niż odejmowanie i operator przypisania złożonego ( +=).

Dlatego wyrażenie y += 10 - 2 * 3jest oceniane jako y = y + (10 - (2 * 3)).

Kroki wykonania
Kroki Operator Wyrażenie Wartość zwrócona z wyrażenia
1 = var y = 15 15
2 * 2 * 3 6
3 - 10 - 6 4
4 + = 15 + 4 19

Szybka kojarzenie operatorów

Chociaż istnieją predefiniowane reguły zdefiniowane przez pierwszeństwo operatorów do oceny wyrażenia, możesz się zastanawiać, co się stanie, jeśli istnieje wiele operatorów o tym samym poziomie pierwszeństwa. Łączność operatorów definiuje sposób grupowania operatorów o tym samym priorytecie.

W języku Swift operatory mogą być skojarzone lewostronnie, prawostronnie lub nie mogą być skojarzone. Operatory, które są asocjacyjne po lewej stronie, grupują swoje operandy od lewej strony instrukcji, operatory asocjacyjne po prawej stronie od prawej, a operatory bez asocjacji nie mają zdefiniowanego zachowania, gdy są użyte w wyrażeniu w kolejności.

Tabela asocjatywności operatorów

Poniższa tabela przedstawia asocjatywność operatorów Swift wraz z priorytetem.

Szybka asocjatywność biblioteki standardowej (pierwszeństwo od najwyższego do najniższego)
Grupy operatorów Przykłady Łączność
Pierwszeństwo przesunięcia bitowego >> & <>>> Żaden
Pierwszeństwo mnożenia & *% & * / lewo
Dodatkowe pierwszeństwo | & + & - + - ^ lewo
Pierwszeństwo formowania zakresu … <… Żaden
Casting Precedence jest jak Żaden
Priorytet zerowej koalescencji ?? dobrze
Pierwszeństwo porównania ! => = <= === == Żaden
Pierwszeństwo koniunkcji logicznej && lewo
Logiczne pierwszeństwo dysjunkcji || lewo
Domyślne pierwszeństwo ~> Żaden
Pierwszeństwo trójskładnikowe ?: dobrze
Funkcja Pierwszeństwo strzałek () dobrze
Pierwszeństwo przypisania | =% = / = & <> = & = * = >> = << = = dobrze

Przykład 3: Szybka asocjatywność operatorów

 let x = 40 / 2 * 10 print(x) 

Po uruchomieniu powyższego programu wynik będzie:

 200

W powyższym programie wyrażenie jest obliczane od lewej do prawej, ponieważ operatory należą do grup pierwszeństwa mnożenia i mają lewą asocjatywność. Dlatego operacja dzielenia odbywa się wcześniej i otrzymujesz wynik 200 . A co jeśli chcesz najpierw wykonać mnożenie? Musisz 2 * 10umieścić wyrażenie w nawiasach klamrowych () jako:

 let x = 40 / (2 * 10) print(x) 

Po uruchomieniu powyższego programu wynik będzie:

 2

Nie musisz zapamiętywać pierwszeństwa i tabeli asocjacyjnej. W większości przypadków pierwszeństwo i łączność operatorów ma sens sam w sobie. W razie wątpliwości zawsze możesz skorzystać z tabeli jako odniesienia. Ponadto lepiej jest używać nawiasów, aby kod był łatwiejszy do zrozumienia.

Interesujące artykuły...