Priorita a asociativita
Priorita a asociativita definují pořadí, ve kterém se operátory použijí. Operátory s vyšší prioritou jsou nejprve svázány s jejich argumenty (operandy), zatímco operátory se stejnou prioritou jsou vázány směrem k jejich asociativitě.
Například výraz 1+2*3
podle priority pro sčítání a násobení je ekvivalentní 1+(2*3)
a 2^3^4
rovná 2^(3^4)
se, protože exponenciace je asociativní.
Operátory
Následující tabulka uvádí dostupné operátory v Q#oblasti , stejně jako jejich prioritu a asociativitu. Dále jsou uvedeny další modifikátory a kombinátory a vazby užší než kterýkoli z těchto operátorů.
Popis | Syntaxe | Operátor | Asociativita | Pořadí podle priority |
---|---|---|---|---|
copy-and-update – operátor | w/ <- |
ternární | left | 0 |
operátor rozsahu | .. |
infix | left | 2 |
podmíněný operátor | ? \| |
ternární | vpravo | 3 |
logický operátor OR | or |
infix | left | 4 |
logický operátor AND | and |
infix | left | 5 |
bitový operátor OR | \|\|\| |
infix | left | 6 |
bitový XOR | ^^^ |
infix | left | 7 |
bitwise AND | &&& |
infix | left | 8 |
rovnost | == |
infix | left | 9 |
nerovnost | != |
infix | left | 9 |
menší než nebo rovno | <= |
infix | left | 10 |
menší než | < |
infix | left | 11 |
větší než nebo rovno | >= |
infix | left | 11 |
větší než | > |
infix | left | 11 |
pravá směna | >>> |
infix | left | 12 |
levý posun | <<< |
infix | left | 12 |
sčítání nebo zřetězení | + |
infix | left | 13 |
odčítání | - |
infix | left | 13 |
násobení | * |
infix | left | 14 |
dělení | / |
infix | left | 14 |
modul | % |
infix | left | 14 |
umocňování | ^ |
infix | vpravo | 15 |
BITWISE NOT | ~~~ |
předpona | vpravo | 16 |
logická HODNOTA NOT | not |
předpona | vpravo | 16 |
Negativní | - |
předpona | vpravo | 16 |
Výrazy kopírování a aktualizace musí mít nutně nejnižší prioritu, aby se zajistilo konzistentní chování odpovídajícího příkazu evaluate-and-reassign. Podobné aspekty jsou u operátoru rozsahu zachytány, aby se zajistilo konzistentní chování odpovídajícího kontextového výrazu.
Modifikátory a kombinátory
Modifikátory lze považovat za speciální operátory, které lze použít pouze u určitých výrazů. Může jim být přiřazena umělá priorita pro zachycení jejich chování.
Další informace naleznete v tématu Výrazy.
Tato umělá priorita je uvedena v následující tabulce spolu s tím, jak priorita operátorů a modifikátorů souvisí s tím,]
jak úzce souvisí kombinátory přístupu k položkám ([
a ::
v uvedeném pořadí) a kombinátory volání ((
, )
) vazby.
Popis | Syntaxe | Operátor | Asociativita | Pořadí podle priority |
---|---|---|---|---|
Kombinátor volání | ( ) |
Není k dispozici | left | 17 |
Adjoint functor | Adjoint |
předpona | vpravo | 18 |
Řízený functor | Controlled |
předpona | vpravo | 18 |
Rozbalení aplikace | ! |
Postfix | left | 19 |
Přístup k pojmenované položce | :: |
Není k dispozici | left | 20 |
Přístup k položce pole | [ ] |
Není k dispozici | left | 20 |
Lambda funkce | -> |
Není k dispozici | vpravo | 21 |
Operace lambda | => |
Není k dispozici | vpravo | 21 |
Pokud chcete znázornit důsledky přiřazených priorit, předpokládejme, že máte jednotkovou operaci DoNothing
(definovanou v deklarací specializace), volatelnou GetStatePrep
operaci, která vrací jednotkovou operaci, a pole algorithms
obsahující položky typu Algorithm
definované následujícím způsobem:
newtype Algorithm = (
Register : Qubit[],
Initialize : Transformation,
Apply : Transformation
);
newtype Transformation =
Qubit[] => Unit is Adj + Ctl;
Následující výrazy jsou pak platné:
GetStatePrep()(arg)
(Transformation(GetStatePrep()))!(arg)
Adjoint DoNothing()
Controlled Adjoint DoNothing(cs, ())
Controlled algorithms[0]::Apply!(cs, _)
algorithms[0]::Register![i]
Když se podíváte na priority definované v tabulce výše, uvidíte, že závorky kolem (Transformation(GetStatePrep()))
jsou nezbytné, aby se následující operátor rozbalení použil na Transformation
hodnotu, a ne na vrácenou operaci.
V závorkách však nejsou vyžadovány GetStatePrep()(arg)
; funkce jsou použity zleva doprava, takže tento výraz je ekvivalentní (GetStatePrep())(arg)
.
Aplikace functoru také nevyžadují závorky kolem nich, aby vyvolaly odpovídající specializaci, ani pole nebo pojmenované výrazy přístupu k položkám. Proto je výraz arr2D[i][j]
dokonale platný, jak je algorithms[0]::Register![i]
.