Sdílet prostřednictvím


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