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]
.
Feedback
https://aka.ms/ContentUserFeedback.
Binnenkort beschikbaar: In de loop van 2024 zullen we GitHub-problemen geleidelijk uitfaseren als het feedbackmechanisme voor inhoud en deze vervangen door een nieuw feedbacksysteem. Zie voor meer informatie:Feedback verzenden en weergeven voor