Delen via


Voorrang en associativiteit

Prioriteit en associativiteit bepalen de volgorde waarin operators worden toegepast. Operatoren met een hogere prioriteit worden eerst gebonden aan hun argumenten (operanden), terwijl operators met dezelfde prioriteit zich binden in de richting van hun associativiteit. De expressie 1+2*3 op basis van de prioriteit voor optellen en vermenigvuldigen is bijvoorbeeld gelijk aan , en 2^3^4 is gelijk aan 1+(2*3)2^(3^4) omdat exponentiatie rechts-associatief is.

Operators

De volgende tabel bevat de beschikbare operators in Q#, evenals hun prioriteit en associativiteit. Aanvullende modifiers en combinators worden ook vermeld en binden nauwer dan een van deze operatoren.

Description Syntax Operator Associativiteit Prioriteit
operator voor kopiƫren en bijwerken w/ <- Ternaire links 1
operator range .. Infix links 2
voorwaardelijke operator ? \| Ternaire right 3
logische OR or Infix links 4
logische AND and Infix links 5
bitsgewijze OR \|\|\| Infix links 6
bitsgewijze XOR ^^^ Infix links 7
bitsgewijze AND &&& Infix links 8
Gelijkheid == Infix links 9
Ongelijkheid != Infix links 9
kleiner dan of gelijk aan <= Infix links 10
kleiner dan < Infix links 11
groter dan of gelijk aan >= Infix links 11
groter dan > Infix links 11
shift rechts >>> Infix links 12
shift links <<< Infix links 12
optellen of samenvoegen + Infix links 13
Aftrekken - Infix links 13
Vermenigvuldiging * Infix links 14
Divisie / Infix links 14
modulus % Infix links 14
exponentiatie ^ Infix right 15
bitwise NOT ~~~ Voorvoegsel right 16
logische NOT not Voorvoegsel right 16
negatief - Voorvoegsel right 16

Expressies voor kopiƫren en bijwerken moeten noodzakelijkerwijs de laagste prioriteit hebben om een consistent gedrag van de bijbehorende evaluate-and-reassign-instructie te garanderen. Vergelijkbare overwegingen gelden voor de bereikoperator om een consistent gedrag van de bijbehorende contextuele expressie te garanderen.

Modificators en combinators

Modifiers kunnen worden gezien als speciale operators die alleen op bepaalde expressies kunnen worden toegepast. Ze kunnen een kunstmatige prioriteit krijgen om hun gedrag vast te leggen.

Zie Expressies voor meer informatie.

Deze kunstmatige prioriteit wordt weergegeven in de volgende tabel, samen met de wijze waarop de prioriteit van operators en wijzigingsfuncties zich verhoudt tot hoe strikte combinaties voor itemtoegang ([]respectievelijk::) en aanroepcombinaties ((, )) binden.

Description Syntax Operator Associativiteit Prioriteit
Gesprekscombinatie ( ) n.v.t. links 17
Aangrenzende functor Adjoint Voorvoegsel right 18
Gecontroleerde functor Controlled Voorvoegsel right 18
Toepassing uitpakken ! Postfix links 19
Toegang tot benoemd item :: n.v.t. links 20
Toegang tot matrixitem [ ] n.v.t. links 20
Functie lambda -> n.v.t. right 21
Bewerking lambda => n.v.t. right 21

Ter illustratie van de gevolgen van de toegewezen prioriteiten, stel dat u een eenheidsbewerking DoNothing hebt (zoals gedefinieerd in specialisatiedeclaraties), een aanroepbare GetStatePrep die een eenheidsbewerking retourneert en een matrix algorithms die items van het type Algorithm bevat die als volgt zijn gedefinieerd

    newtype Algorithm = (
        Register : Qubit[],
        Initialize : Transformation,
        Apply : Transformation
    );

    newtype Transformation =
        Qubit[] => Unit is Adj + Ctl;

De volgende expressies zijn dus allemaal geldig:

    GetStatePrep()(arg)
    (Transformation(GetStatePrep()))!(arg)
    Adjoint DoNothing()
    Controlled Adjoint DoNothing(cs, ())
    Controlled algorithms[0]::Apply!(cs, _)
    algorithms[0]::Register![i]

Als u de prioriteiten bekijkt die in de bovenstaande tabel zijn gedefinieerd, ziet u dat de haakjes rond (Transformation(GetStatePrep())) nodig zijn om de volgende uitpakoperator toe te passen op de Transformation waarde in plaats van de geretourneerde bewerking. Haakjes zijn echter niet vereist in GetStatePrep()(arg); functies worden van links naar rechts toegepast, dus deze expressie is gelijk aan (GetStatePrep())(arg). Functortoepassingen hebben ook geen haakjes nodig om de bijbehorende specialisatie aan te roepen, noch matrix- of benoemde itemtoegangsexpressies. De expressie arr2D[i][j] is dus perfect geldig, net als algorithms[0]::Register![i].