Dela via


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].