優先順序和關聯性
優先順序和關聯性會定義套用運算子的順序。 優先順序較高的運算符會先系結至其自變數(操作數),而具有相同優先順序的運算符會系結至其關聯性的方向。
例如,根據加法和乘法優先順序的表達式 1+2*3
相當於 1+(2*3)
,而且 2^3^4
相等 2^(3^4)
,因為指數是右關聯。
操作員
下表列出 中的 Q#可用運算符,以及其優先順序和關聯性。 也會列出其他 修飾詞和結合子 ,並系結比這些運算符中的任何一個更緊密。
描述 | 語法 | 運算子 | 關聯性 | 優先順序 |
---|---|---|---|---|
copy-and-update 運算符 | w/ <- |
三重的 | left | 1 |
range 運算子 | .. |
中置 | left | 2 |
條件運算元 | ? \| |
三重的 | right | 3 |
邏輯 OR | or |
中置 | left | 4 |
邏輯 AND | and |
中置 | left | 5 |
位 OR | \|\|\| |
中置 | left | 6 |
位 XOR | ^^^ |
中置 | left | 7 |
位 AND | &&& |
中置 | left | 8 |
平等 | == |
中置 | left | 9 |
不等式 | != |
中置 | left | 9 |
less-than-or-equal | <= |
中置 | left | 10 |
小於 | < |
中置 | left | 11 |
大於或等於 | >= |
中置 | left | 11 |
大於 | > |
中置 | left | 11 |
右移 | >>> |
中置 | left | 12 |
左移 | <<< |
中置 | left | 12 |
新增 或 串連 | + |
中置 | left | 13 |
減法 | - |
中置 | left | 13 |
乘法 | * |
中置 | left | 14 |
劃分 | / |
中置 | left | 14 |
modulus | % |
中置 | left | 14 |
exponentiation | ^ |
中置 | right | 15 |
位 NOT | ~~~ |
prefix | right | 16 |
邏輯 NOT | not |
prefix | right | 16 |
陰性 | - |
prefix | right | 16 |
複製和更新表達式必須具有最低優先順序,以確保對應 評估與重新指派語句的一致行為。 範圍運算子的類似考慮,以確保對應 內容表達式的一致行為。
修飾詞和結合子
修飾詞可以視為只能套用至特定表達式的特殊運算符。 他們可以指派人工優先順序來擷取其行為。
如需詳細資訊,請參閱 表達式。
下表列出此人工優先順序,以及運算元和修飾詞的優先順序與專案存取結合子(以及分別)和呼叫結合子 ([
]
(
、 )
) 系結的關聯性。::
描述 | 語法 | 運算子 | 關聯性 | 優先順序 |
---|---|---|---|---|
呼叫結合器 | ( ) |
n/a | left | 17 |
Adjoint functor | Adjoint |
prefix | right | 18 |
受控制函式 | Controlled |
prefix | right | 18 |
解除包裝應用程式 | ! |
後綴 | left | 19 |
具名專案存取 | :: |
n/a | left | 20 |
陣列專案存取 | [ ] |
n/a | left | 20 |
函式 Lambda | -> |
n/a | right | 21 |
作業 Lambda | => |
n/a | right | 21 |
為了說明指派優先順序的影響,假設您有一個單位運算(如特製化宣告中所定義)、可呼叫的可GetStatePrep
傳回單位運算DoNothing
,以及包含定義為下列類型Algorithm
專案的數位algorithms
newtype Algorithm = (
Register : Qubit[],
Initialize : Transformation,
Apply : Transformation
);
newtype Transformation =
Qubit[] => Unit is Adj + Ctl;
然後,下列表達式都是有效的:
GetStatePrep()(arg)
(Transformation(GetStatePrep()))!(arg)
Adjoint DoNothing()
Controlled Adjoint DoNothing(cs, ())
Controlled algorithms[0]::Apply!(cs, _)
algorithms[0]::Register![i]
查看上表中定義的優先順序,您可以看到 (Transformation(GetStatePrep()))
後續解除包裝運算符必須套用到 Transformation
值,而不是傳回的作業。
不過,中 GetStatePrep()(arg)
不需要括弧;函式會由左至右套用,因此此運算式相當於 (GetStatePrep())(arg)
。
Functor 應用程式也不需要括號來叫用對應的特製化,也不需要數位或具名專案存取表達式。 因此,表達式arr2D[i][j]
完全有效,如同 。algorithms[0]::Register![i]