条件分岐
条件分岐は、 if
式の形式で表されます。 if
式は、if
句の後に 0 個以上のelif
句と、必要に応じて else-block で構成されます。 各句は、次のパターンに従います
keyword condition {
<statements>
}
ここで、keyword
はそれぞれ if
または elif
に置き換えられ、condition
は型 Bool
の式であり、<statements>
は 0 個以上のステートメントに置き換えられます。 省略可能な else
ブロックは、キーワード else
の後に、中かっこで囲まれた 0 個以上のステートメント ( {
}
) で構成されます。
condition
が true
に評価される最初のブロックが実行されます。 どの条件も true
に評価されない場合は、else
ブロック (存在する場合) が実行されます。 ブロックは独自のスコープで実行されます。つまり、ブロックの一部として行われたバインドは、ブロックの終了後は表示されません。
たとえば、qubits
が型 Qubit[]
の値であり、r1
と r2
が型 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
式を含めたり、そのブロックの外部で宣言されている変更可能な変数を更新したりすることはできません。