条件分岐

条件分岐は式の if 形式で表されます。 式は if 句で if 構成され、その後に 0 個以上 elif の句が続き、必要に応じて else-block が続きます。 各句は、次のパターンに従います

keyword condition {
    <statements>
}

ここで、keyword はそれぞれ if または elif に置き換えられ、condition は型 Bool の式であり、<statements> は 0 個以上のステートメントに置き換えられます。 省略可能な else ブロックは、キーワード else と、それに続く中かっこ ({}) で囲まれた 0 個以上のステートメントで構成されます。

conditiontrue に評価される最初のブロックが実行されます。 どの条件も true に評価されない場合は、else ブロック (存在する場合) が実行されます。 ブロックは独自のスコープで実行されます。つまり、ブロックの一部として行われたバインドは、ブロックの終了後は表示されません。

たとえば、qubits が型 Qubit[] の値であり、r1r2 が型 Result の値であるとします。

if r1 == One {
    let q = qubits[0];
    H(q);
} 
elif r2 == One {
    let q = qubits[1];
    H(q);
} 
else {
    H(qubits[2]);
}

条件式の形式で単純な分岐を表すこともできます。

ターゲット固有の制限

制御フロー コンストラクトと量子計算の間の緊密な統合によって、現在の量子ハードウェアの課題が提起されます。 特定の量子プロセッサは、測定結果に基づく分岐をサポートしていません。 そのため、このようなハードウェアでの実行を目的とした Q# プログラムの場合、型 Result の値の比較は常にコンパイル エラーになります。

他の量子プロセッサは、測定結果に基づく特定の種類の分岐をサポートしています。 でQ#サポートされるより一般的なif式は、そのようなプロセッサで実行できる適切な命令にコンパイルされます。 適用される制限は、型 Result の値を演算の式内 if の条件の一部としてのみ比較できる点です。 さらに、条件付き実行ブロックに式を含 return めたり、そのブロックの外部で宣言されている変更可能な変数を更新したりすることはできません。