Prioritet och associativitet
Prioritet och associativitet definierar i vilken ordning operatorerna tillämpas. Operatorer med högre prioritet är bundna till sina argument (operander) först, medan operatorer med samma prioritetsbindning i riktningen för deras associativitet.
Uttrycket 1+2*3
enligt prioriteten för addition och multiplikation motsvarar till 1+(2*3)
exempel , och 2^3^4
är lika 2^(3^4)
med eftersom exponenteringen är rätt associativ.
Operatorer
I följande tabell visas tillgängliga operatorer i Q#, samt deras prioritet och associativitet. Ytterligare modifierare och kombinatorer visas också, och bindningen är hårdare än någon av dessa operatorer.
beskrivning | Syntax | Operator | Associativitet | Prioritet |
---|---|---|---|---|
copy-and-update-operator | w/ <- |
trefaldig | left | 1 |
intervalloperator | .. |
infix | left | 2 |
villkorsstyrd operator | ? \| |
trefaldig | Höger | 3 |
logisk OR | or |
infix | left | 4 |
logisk AND | and |
infix | left | 5 |
bitwise OR | \|\|\| |
infix | left | 6 |
bitvis XOR | ^^^ |
infix | left | 7 |
bitwise OCH | &&& |
infix | left | 8 |
jämlikhet | == |
infix | left | 9 |
ojämlikhet | != |
infix | left | 9 |
mindre än eller lika med | <= |
infix | left | 10 |
mindre än | < |
infix | left | 11 |
större än eller lika med | >= |
infix | left | 11 |
större än | > |
infix | left | 11 |
höger skift | >>> |
infix | left | 12 |
vänster skift | <<< |
infix | left | 12 |
addition eller sammanfogning | + |
infix | left | 13 |
subtraktion | - |
infix | left | 13 |
multiplikation | * |
infix | left | 14 |
division | / |
infix | left | 14 |
modulus | % |
infix | left | 14 |
exponentiering | ^ |
infix | Höger | 15 |
bitwise NOT | ~~~ |
prefix | Höger | 16 |
logisk NOT | not |
prefix | Höger | 16 |
Negativ | - |
prefix | Höger | 16 |
Kopierings- och uppdateringsuttryck måste nödvändigtvis ha den lägsta prioriteten för att säkerställa ett konsekvent beteende för motsvarande utvärderings- och omtilldelningsuttryck. Liknande överväganden gäller för intervalloperatorn för att säkerställa ett konsekvent beteende för motsvarande kontextuella uttryck.
Modifierare och kombinerare
Modifierare kan ses som särskilda operatorer som endast kan tillämpas på vissa uttryck. De kan tilldelas en artificiell prioritet för att fånga deras beteende.
Mer information finns i Uttryck.
Den här artificiella prioriteten visas i följande tabell, tillsammans med hur prioriteten för operatorer och modifierare relaterar till hur nära objektåtkomstkombinatorer ([
]
respektive::
) och anropskombinatorer ((
, )
) binder.
beskrivning | Syntax | Operator | Associativitet | Prioritet |
---|---|---|---|---|
Samtalskombinator | ( ) |
saknas | left | 17 |
Adjoint-kultor | Adjoint |
prefix | Höger | 18 |
Kontrollerad kultor | Controlled |
prefix | Höger | 18 |
Packa upp program | ! |
Postfix | left | 19 |
Åtkomst till namngivet objekt | :: |
saknas | left | 20 |
Åtkomst till matrisobjekt | [ ] |
saknas | left | 20 |
Funktion lambda | -> |
saknas | Höger | 21 |
Operation lambda | => |
saknas | Höger | 21 |
För att illustrera konsekvenserna av de tilldelade prioriteterna antar du att du har en enhetlig åtgärd DoNothing
(enligt definitionen i specialiseringsdeklarationer), en anropsbar GetStatePrep
som returnerar en enhetlig åtgärd och en matris algorithms
som innehåller objekt av typen Algorithm
som definieras på följande sätt
newtype Algorithm = (
Register : Qubit[],
Initialize : Transformation,
Apply : Transformation
);
newtype Transformation =
Qubit[] => Unit is Adj + Ctl;
Följande uttryck är sedan giltiga:
GetStatePrep()(arg)
(Transformation(GetStatePrep()))!(arg)
Adjoint DoNothing()
Controlled Adjoint DoNothing(cs, ())
Controlled algorithms[0]::Apply!(cs, _)
algorithms[0]::Register![i]
Om du tittar på de prioriteter som definierats i tabellen ovan kan du se att parenteserna runt (Transformation(GetStatePrep()))
är nödvändiga för att den efterföljande avskrivningsoperatorn ska tillämpas på värdet i stället för Transformation
den returnerade åtgärden.
Parenteser krävs dock inte i GetStatePrep()(arg)
; funktioner tillämpas från vänster till höger, så det här uttrycket motsvarar (GetStatePrep())(arg)
.
Functor-program kräver inte heller parenteser runt dem för att anropa motsvarande specialisering, inte heller matris eller namngivna objektåtkomstuttryck. arr2D[i][j]
Uttrycket är alltså helt giltigt, liksom algorithms[0]::Register![i]
.