Snabb operatörsprioritet och associativitet (med exempel)

I den här artikeln lär du dig om de regler som används för att utvärdera ett uttryck med operatörer och operander.

Snabb operatörs företräde

Operatörens företräde är en samling regler som används för att utvärdera ett givet matematiskt uttryck. När det finns flera operatörer som används i ett enda uttryck utvärderas varje del i en viss ordning som kallas operatörens företräde. Vissa operatörer har högre prioritet än andra vilket påverkar hur ett uttryck utvärderas.

Operatörens prioritetstabell

Tabellen nedan visar företrädernas prioritet i Swift. Ju högre det visas i tabellen, desto högre är dess företräde.

Swift Standard Library-företagsgrupper (högsta till lägsta)
Operatörsgrupper Exempel
Bitvis skiftprioritet >> & <>>>
Multiplikationsprioritet & *% & * /
Tilläggsprioritet | & + & - + - ^
Räckviddsformation … <…
Casting Precedence är som
Nil-Coalescing Precedence ??
Jämförelse ! => = <= === ==
Logisk konjunktionspredens &&
Logisk disjunktionspredens ||
Standardprioritet ~>
Ternär företräde ?:
Funktion Pilens företräde ()
Uppdragets företräde | =% = / = & <> = & = * = >> = << = = + = - =

Exempel 1: Swift Operator Precedence

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

När du kör programmet ovan kommer utmatningen att vara:

 29

I exemplet ovan, om du läser uttrycket från vänster till höger, kan du förvänta dig att utdata är 45. Men multiplikationsoperatören har högre prioritet än additionsoperator så uttrycket 4 + 5 * 5 utvärderas som 4 + (5 * 5). Därför print(x)matar ut 29 på skärmen.

Steg för utförande
Steg Operatör Uttryck Värde som returneras från uttryck
1 * 5 * 5 25
2 + 4 + 25 29
3 = skriva ut (x) 29

Exempel 2: Snabb operatörsprioritet med komplex tilldelningsoperatör

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

När du kör programmet ovan kommer utmatningen att vara:

 19

I exemplet ovan var y = 15tilldelar uttrycket värde 15 i variabeln y.

I nästa uttryck y += 10 - 2 * 3har multiplikationsoperatören högre prioritet än subtraktion och sammansatt tilldelningsoperator ( +=).

Därför y += 10 - 2 * 3utvärderas uttrycket som y = y + (10 - (2 * 3)).

Steg för utförande
Steg Operatör Uttryck Värde som returneras från uttryck
1 = var y = 15 15
2 * 2 * 3 6
3 - 10 - 6 4
4 + = 15 + 4 19

Snabb operatörsförening

Även om det finns fördefinierade regler som definieras av operatörens företräde för att utvärdera ett uttryck, kanske du undrar vad som händer om det finns flera operatörer med samma prioritetsnivå. Operatörens associativitet definierar hur operatörer med samma företräde grupperas tillsammans.

I Swift kan operatörer vara antingen vänsterassociativa, högerassociativa eller inte ha någon associativitet. Operatörer som är vänsterassociativa, grupperar sina operander från vänster om uttalandet, högerassociativa operatörer från höger och operatörer utan associativitet har inget definierat beteende när de används i ordning i ett uttryck.

Tabell för operatörsassociativitet

Tabellen nedan visar associeringsförmågan hos Swift-operatörer tillsammans med företräde.

Snabb standardbibliotekassociativitet (företräde högst till lägst)
Operatörsgrupper Exempel Associativitet
Bitvis skiftprioritet >> & <>>> ingen
Multiplikationsprioritet & *% & * / vänster
Tilläggsprioritet | & + & - + - ^ vänster
Räckviddsformation … <… ingen
Casting Precedence är som ingen
Nil-Coalescing Precedence ?? rätt
Jämförelse ! => = <= === == ingen
Logisk konjunktionspredens && vänster
Logisk disjunktionspredens || vänster
Standardprioritet ~> ingen
Ternär företräde ?: rätt
Funktion Pilens företräde () rätt
Uppdragets företräde | =% = / = & <> = & = * = >> = << = = rätt

Exempel 3: Snabb operatörsförening

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

När du kör programmet ovan kommer utmatningen att vara:

 200

I ovanstående program utvärderas uttrycket från vänster till höger eftersom operatörerna faller i multiplikationsprioritetsgrupper och har lämnat associativitet. Därför sker delningsoperationen tidigare och du får resultatet 200 . Vad händer om du vill utföra multiplikationen först? Du måste slå in 2 * 10uttrycket i hakparenteser som:

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

När du kör programmet ovan kommer utmatningen att vara:

 2

Du behöver inte memorera företräde och associerande tabell. För det mesta är operatörernas företräde och associativitet meningsfullt i sig. Du kan alltid använda tabellen som referens när du är osäker. Det är också bättre att använda parentes för att göra din kod lättare att förstå.

Intressanta artiklar...