Nopea operaattorin etusija ja assosiatiivisuus (esimerkkien kanssa)

Tässä artikkelissa opit säännöistä, joita käytetään lausekkeen arviointiin operaattoreiden ja operandien kanssa.

Nopea operaattorin etusija

Operaattorin prioriteetti on kokoelma sääntöjä, joita käytetään tietyn matemaattisen lausekkeen arviointiin. Kun yhdessä lausekkeessa käytetään useita operaattoreita, kukin osa arvioidaan tietyssä järjestyksessä, jota kutsutaan operaattorin etusijalle. Tietyillä operaattoreilla on korkeampi prioriteetti kuin muilla, mikä vaikuttaa lausekkeen arviointiin.

Operaattorin prioriteettitaulukko

Alla olevassa taulukossa luetellaan operaattoreiden etusija Swiftissä. Mitä korkeampi se näkyy taulukossa, sitä korkeampi sen etusija.

Nopeat kirjastojen etusijaryhmät (korkeimmasta matalimpaan)
Operaattoriryhmät Esimerkkejä
Bittisuuntainen muutoksen etusija >> & <>>>
Kertomisen etusija & *% & * /
Lisäysprioriteetti | & + & - + - ^
Alueen muodostumisen etusija … <…
Casting-etusija on kuin
Nollapitoisuus ??
Vertailun etusija ! => = <= === ==
Loogisen konjunktion etusija &&
Loogisen disjunktion etusija ||
Oletusaste ~>
Ternäärinen etusija ?:
Toiminto Nuolen etusija ()
Tehtävän etusija | =% = / = & <> = & = * = >> = << = = + = - =

Esimerkki 1: Nopea operaattorin etusija

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

Kun suoritat yllä olevan ohjelman, tulos on:

 29

Yllä olevassa esimerkissä, jos luet lausekkeen vasemmalta oikealle, saatat odottaa, että tulos on 45. Kertolaskuoperaattorilla on kuitenkin korkeampi etusija kuin lisäysoperaattorilla, joten lauseke 4 + 5 * 5 arvioidaan 4 + (5 * 5). Siksi print(x)tuottaa 29 näytöllä.

Suoritusvaiheet
Askeleet Operaattori Ilmaisu Arvo palautettiin ilmaisusta
1 * 5 * 5 25
2 + 4 + 25 29
3 = tulosta (x) 29

Esimerkki 2: Nopea operaattorin etusija monimutkaisella määritysoperaattorilla

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

Kun suoritat yllä olevan ohjelman, tulos on:

 19

Yllä olevassa esimerkissä lauseke var y = 15määrittää arvon 15 muuttujaan y.

Seuraavassa lausekkeessa y += 10 - 2 * 3kertolaskuoperaattorilla on korkeampi etusija kuin vähennys- ja yhdistämisoperaattorilla ( +=).

Siksi ilmaisu y += 10 - 2 * 3arvioidaan y = y + (10 - (2 * 3)).

Suoritusvaiheet
Askeleet Operaattori Ilmaisu Arvo palautettiin ilmaisusta
1 = var y = 15 15
2 * 2 * 3 6
3 - 10-6 4
4 + = 15 + 4 19

Nopea operaattorin assosiatiivisuus

Vaikka operaattorin etusija määrittelee ennalta määritellyt säännöt lausekkeen arvioimiseksi, saatat miettiä, mitä tapahtuu, jos useita prioriteettitason operaattoreita on. Operaattorien assosiatiivisuus määrittelee, kuinka saman prioriteetin operaattorit ryhmitellään yhteen.

Swiftissä operaattorit voivat olla joko vasemmalle assosiatiivisia, oikealle assosiatiivisia tai heillä ei ole assosiatiivisuutta. Operaattoreilla, jotka ovat assosiatiivisia vasemmalle, ryhmittelevät operandinsa lauseen vasemmalta puolelta, oikealle assosiatiivisille operaattoreille oikealta ja operaattoreille, joilla ei ole assosiatiivisuutta, ei ole määriteltyä käyttäytymistä, kun niitä käytetään peräkkäin lausekkeessa.

Operaattorin assosiatiivisuustaulukko

Alla olevassa taulukossa on esitetty Swift-operaattoreiden assosiatiivisuus etusijalla.

Swift Standard Library Associativity (etusija korkeimmasta pienimpään)
Operaattoriryhmät Esimerkkejä Assosiatiivisuus
Bittisuuntainen muutoksen etusija >> & <>>> ei mitään
Kertomisen etusija & *% & * / vasemmalle
Lisäysprioriteetti | & + & - + - ^ vasemmalle
Alueen muodostumisen etusija … <… ei mitään
Casting-etusija on kuin ei mitään
Nollapitoisuus ?? oikein
Vertailun etusija ! => = <= === == ei mitään
Loogisen konjunktion etusija && vasemmalle
Loogisen disjunktion etusija || vasemmalle
Oletusaste ~> ei mitään
Ternäärinen etusija ?: oikein
Toiminto Nuolen etusija () oikein
Tehtävän etusija | =% = / = & <> = & = * = >> = << = = oikein

Esimerkki 3: Nopea operaattorin assosiatiivisuus

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

Kun suoritat yllä olevan ohjelman, tulos on:

 200

Edellä olevassa ohjelmassa lauseke arvioidaan vasemmalta oikealle, koska operaattorit kuuluvat kertolaskujärjestyksiin ja jättävät assosiatiivisuuden. Siksi jakotoiminta tapahtuu aikaisemmin ja saat tuloksen 200 . Entä jos haluat suorittaa kertolaskun ensin? Sinun on käärittävä 2 * 10lauseke () aaltosulkeisiin seuraavasti:

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

Kun suoritat yllä olevan ohjelman, tulos on:

 2

Sinun ei tarvitse muistaa etusija- ja assosiaatiotaulukkoa. Suurimman osan ajasta operaattoreiden etusija ja assosiatiivisuus ovat itsessään järkeviä. Voit aina käyttää taulukkoa viitteeksi, jos olet epävarma. Lisäksi on parempi käyttää sulkeita, jotta koodisi olisi helpompi ymmärtää.

Mielenkiintoisia artikkeleita...