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 | 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 = 15
tilldelar uttrycket värde 15 i variabeln y.
I nästa uttryck y += 10 - 2 * 3
har multiplikationsoperatören högre prioritet än subtraktion och sammansatt tilldelningsoperator ( +=
).
Därför y += 10 - 2 * 3
utvärderas uttrycket som y = y + (10 - (2 * 3))
.
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 * 10
uttrycket 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å.