次の方法で共有


優先順位と結合規則

優先順位と結合規則は、演算子を適用する順序を定義します。 優先順位の高い演算子は最初に引数 (オペランド) にバインドされ、同じ優先順位を持つ演算子は結合規則の方向にバインドされます。 たとえば、加算と乗算の優先順位に従って 1+2*3 式は 1+(2*3)に相当し、指数は右結合であるため、2^3^42^(3^4) と等しくなります。

オペレーター

次の表に、Q#で使用できる演算子と、その優先順位と結合性を示します。 追加の 修飾子と組み合わせ子も一覧表示され、これらの演算子よりも厳密にバインドされます。

説明 構文 オペレーター 結合規則 優先順位
copy-and-update 演算子 する w/ <- 三 項 1
範囲演算子 .. 挿入辞 2
条件付き演算子 する ? \| 三 項 3
論理 OR する or 挿入辞 4
論理 AND and 挿入辞 5
ビットごとの OR する \|\|\| 挿入辞 6
ビットごとの XOR する ^^^ 挿入辞 7
ビットごとの AND する &&& 挿入辞 8
等値 する == 挿入辞 9
の不等値 != 挿入辞 9
以下の <= 挿入辞 10
未満の < 挿入辞 11
以上の >= 挿入辞 11
より大きい > 挿入辞 11
右シフト する >>> 挿入辞 12
左シフト する <<< 挿入辞 12
加算 または連結 + 挿入辞 13
減算 - 挿入辞 13
乗算 する * 挿入辞 14
division / 挿入辞 14
࠾余 % 挿入辞 14
指数 ^ 挿入辞 15
ビットごとの NOT ~~~ prefix 16
論理 NOT not prefix 16
負の - prefix 16

copy-and-update 式は、対応する evaluate-and-reassign ステートメントの一貫した動作を保証するために、必ずしも最も低い優先順位を持つ必要があります。 対応する コンテキスト式の一貫性のある動作を保証するために、範囲演算子にも同様の考慮事項

修飾子と連結子

修飾子は、特定の式にのみ適用できる特殊な演算子と見なすことができます。 それらの動作をキャプチャするために、人為的な優先順位を割り当てることができます。

詳細については、「式の」を参照してください。

この人為的な優先順位を次の表に示します。演算子と修飾子の優先順位は、項目アクセスの組み合わせ子 (それぞれ[]::) と呼び出しコンバイネーター (()) のバインドとどのように密接に関係しているかに関連しています。

説明 構文 オペレーター 結合規則 優先順位
呼び出しコンバイネーター ( ) n/a 17
隣接するファンクター Adjoint prefix 18
制御されたファンクター Controlled prefix 18
アプリケーション のラップ解除 ! postfix 19
名前付きアイテム アクセス . n/a 20
配列項目のアクセス [ ] n/a 20
関数ラムダ -> n/a 21
操作ラムダ => n/a 21

割り当てられた優先順位の影響を示すために、(特殊化宣言で定義されている) ユニタリ演算 DoNothing、ユニタリ演算を返す呼び出し可能な GetStatePrep、および次のように定義 Algorithm 型の項目を含む配列 algorithms があるとします。

    struct Algorithm {
        Register : Qubit[],
        Initialize : Transformation,
        Apply : Transformation,
    } 

次の式はすべて有効です。

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

上記の表で定義されている優先順位を見ると、後続のアンラップ演算子を返された操作ではなく、Transformation 値に適用するために、(Transformation(GetStatePrep())) の周りのかっこが必要であることがわかります。 ただし、GetStatePrep()(arg)ではかっこは必要ありません。関数は左から右に適用されるため、この式は (GetStatePrep())(arg)と同じです。 Functor アプリケーションでは、対応する特殊化を呼び出すためにかっこを囲む必要も、配列や名前付き項目のアクセス式も必要ありません。 したがって、式 arr2D[i][j] は、algorithms[0]::Register![i]と同様に完全に有効です。