Megosztás a következőn keresztül:


Elsőbbség és asszociativitás

Az elsőbbség és az asszociativitás határozza meg az operátorok alkalmazásának sorrendjét. A magasabb prioritású operátorok először az argumentumaikhoz (operandusaikhoz) vannak kötve, míg az azonos prioritású operátorok az asszociativitásuk irányába kötnek. Az összeadás és szorzás prioritása szerinti kifejezés 1+2*3 például egyenértékű 1+(2*3)a és 2^3^42^(3^4) az értékével, mivel az exponenciális érték jobb asszociatív.

Operátorok

Az alábbi táblázat a rendelkezésre álló operátorokat Q#, valamint azok prioritását és asszociativitását sorolja fel. További módosítók és kombinátorok is szerepelnek a listán, és szorosabb kötést jelentenek ezen operátorok bármelyikénél.

Description Syntax Operátor Társítás Precedencia
copy-and-update operátor w/ <- Háromkomponensű balra 1
range operátor .. Infix balra 2
feltételes operátor ? \| Háromkomponensű right 3
logikai VAGY or Infix balra 4
logikai ÉS and Infix balra 5
bitenkénti VAGY \|\|\| Infix balra 6
bitenkénti XOR ^^^ Infix balra 7
bitenkénti ÉS &&& Infix balra 8
Egyenlőség == Infix balra 9
Egyenlőtlenség != Infix balra 9
kisebb-mint-vagy egyenlő <= Infix balra 10
kisebb, mint < Infix balra 11
nagyobb-mint-vagy egyenlő >= Infix balra 11
nagyobb, mint > Infix balra 11
jobb oldali műszak >>> Infix balra 12
bal oldali műszak <<< Infix balra 12
összeadás vagy összefűzés + Infix balra 13
Kivonás - Infix balra 13
Szorzás * Infix balra 14
Osztály / Infix balra 14
Modulus % Infix balra 14
exponenciáció ^ Infix right 15
bitenkénti NEM ~~~ Előtag right 16
logikai NEM not Előtag right 16
negatív - Előtag right 16

A másolási és frissítési kifejezéseknek feltétlenül a legalacsonyabb prioritással kell rendelkezniük a megfelelő evaluate-and-reassign utasítás konzisztens viselkedésének biztosításához. A tartományoperátorhoz hasonló szempontokat kell figyelembe venni a megfelelő környezetfüggő kifejezés konzisztens viselkedésének biztosítása érdekében.

Módosítók és kombinátorok

A módosítók speciális operátoroknak tekinthetők, amelyek csak bizonyos kifejezésekre alkalmazhatók. A viselkedésük rögzítéséhez mesterséges prioritást rendelhetnek hozzájuk.

További információ: Kifejezések.

Ez a mesterséges prioritás az alábbi táblázatban szerepel, valamint azt, hogy az operátorok és módosítók prioritása hogyan kapcsolódik ahhoz,] hogy milyen szoros elemhozzáférési kombinátorok ([és::) és hívja meg a kombinátorok ((, )) kötését.

Description Syntax Operátor Társítás Precedencia
Hívó kombinátor ( ) n.a. balra 17
Mellékjeles funktor Adjoint Előtag right 18
Szabályozott funktor Controlled Előtag right 18
Alkalmazás kicsomagolása ! Postfix balra 19
Elnevezett elem elérése :: n.a. balra 20
Tömbelem elérése [ ] n.a. balra 20
Lambda függvény -> n.a. right 21
Lambda művelet => n.a. right 21

A hozzárendelt prioritások következményeinek szemléltetéséhez tegyük fel, hogy rendelkezik egy unitáris művelettel DoNothing (a specializációs deklarációkban meghatározottak szerint), egy hívhatóval GetStatePrep , amely egy egységes műveletet ad vissza, valamint egy tömböt algorithms , amely az alábbiak szerint definiált típusú Algorithm elemeket tartalmaz

    newtype Algorithm = (
        Register : Qubit[],
        Initialize : Transformation,
        Apply : Transformation
    );

    newtype Transformation =
        Qubit[] => Unit is Adj + Ctl;

A következő kifejezések érvényesek:

    GetStatePrep()(arg)
    (Transformation(GetStatePrep()))!(arg)
    Adjoint DoNothing()
    Controlled Adjoint DoNothing(cs, ())
    Controlled algorithms[0]::Apply!(cs, _)
    algorithms[0]::Register![i]

A fenti táblázatban definiált prioritásokat tekintve láthatja, hogy a zárójelek ahhoz (Transformation(GetStatePrep())) szükségesek, hogy a későbbi unwrap operátort a visszaadott művelet helyett az Transformation értékre alkalmazza. A(z) rendszerben azonban nincs szükség GetStatePrep()(arg)zárójelekre; a függvények balról jobbra vannak alkalmazva, így ez a kifejezés egyenértékű a következőkkel (GetStatePrep())(arg): . A Functor-alkalmazásoknak nincs szükségük zárójelekre a megfelelő specializáció meghívásához, és a tömb- vagy elnevezett elem-hozzáférési kifejezésekhez sem. Így a kifejezés arr2D[i][j] tökéletesen érvényes, ahogy az is.algorithms[0]::Register![i]