Delen via


Voorrang en associativiteit

Prioriteit en associativiteit bepalen de volgorde waarin operators worden toegepast. Operators met een hogere prioriteit zijn eerst gebonden aan hun argumenten (operanden), terwijl operators met dezelfde prioriteit 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 2^(3^4) aan 1+(2*3)omdat exponentiatie rechts-associatief is.

Operators

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

Beschrijving Syntaxis Operator Associativiteit Prioriteit
operator voor kopiƫren en bijwerken w/ <- Ternaire left 1
bereikoperator .. infix left 2
voorwaardelijke operator ? \| Ternaire Rechts 3
logische OR or infix left 4
logische AND and infix left 5
bitsgewijze OR \|\|\| infix left 6
bitsgewijze XOR ^^^ infix left 7
bitwise AND &&& infix left 8
gelijkheid == infix left 9
ongelijkheid != infix left 9
kleiner dan of gelijk aan <= infix left 10
kleiner dan < infix left 11
groter dan of gelijk aan >= infix left 11
groter dan > infix left 11
rechter shift >>> infix left 12
linker shift <<< infix left 12
optellen of samenvoegen + infix left 13
aftrekking - infix left 13
vermenigvuldiging * infix left 14
divisie / infix left 14
modulus % infix left 14
exponentiatie ^ infix Rechts 15
bitwise NOT ~~~ voorvoegsel Rechts 16
logische NOT not voorvoegsel Rechts 16
Negatief - voorvoegsel Rechts 16

Expressies voor kopiƫren en bijwerken moeten noodzakelijkerwijs de laagste prioriteit hebben om een consistent gedrag van de bijbehorende instructie evalueren en opnieuw toewijzen te garanderen. Vergelijkbare overwegingen houden rekening met 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 vermeld in de volgende tabel, samen met hoe de prioriteit van operators en modifiers zich verhoudt tot hoe nauw combinaties voor itemtoegang ([]en :: respectievelijk) en aanroepcombinaties ((, )) bindt.

Beschrijving Syntaxis Operator Associativiteit Prioriteit
Gesprekscombinatie ( ) N.v.t. left 17
Aangrenzende functor Adjoint voorvoegsel Rechts 18
Gecontroleerde functor Controlled voorvoegsel Rechts 18
Toepassing uitpakken ! Postfix left 19
Toegang tot benoemde items :: N.v.t. left 20
Toegang tot matrixitems [ ] N.v.t. left 20
Functie lambda -> N.v.t. Rechts 21
Bewerking lambda => N.v.t. Rechts 21

Als u de gevolgen van de toegewezen prioriteit wilt illustreren, stelt u zich een eenheidsbewerking DoNothing voor (zoals gedefinieerd in specialisatiedeclaraties), een aanroepbaar GetStatePrep dat 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 dan 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 prioriteit bekijkt die in de bovenstaande tabel zijn gedefinieerd, ziet u dat de haakjes (Transformation(GetStatePrep())) rond nodig zijn om de volgende operator voor uitpakken toe te passen op de Transformation waarde in plaats van op 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). Functor-toepassingen hebben ook geen haakjes eromheen nodig om de bijbehorende specialisatie aan te roepen, en evenmin matrix- of benoemde expressies voor itemtoegang. De expressie arr2D[i][j] is dus perfect geldig, zoals is algorithms[0]::Register![i].