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^4
2^(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]
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: