共用方式為


優先順序和關聯性

優先順序和關聯性會定義套用運算子的順序。 優先順序較高的運算符會先系結至其自變數(操作數),而具有相同優先順序的運算符會系結至其關聯性的方向。 例如,根據加法和乘法優先順序的表達式 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]