優先順位と結合規則は、演算子を適用する順序を定義します。 優先順位の高い演算子は最初に引数 (オペランド) にバインドされ、同じ優先順位を持つ演算子は結合規則の方向にバインドされます。
たとえば、加算と乗算の優先順位に従って 1+2*3
式は 1+(2*3)
に相当し、指数は右結合であるため、2^3^4
は 2^(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]
と同様に完全に有効です。