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