Условное ветвление
Условное ветвление выражается в виде выражений if
. if
Выражение состоит из if
предложения, за которым следует нулевое или большее elif
число предложений, а также при необходимости другого блока. Каждое предложение следует шаблону:
keyword condition {
<statements>
}
где keyword
заменяется на if
или elif
соответственно, condition
является выражением типа Bool
, а <statements>
заменяется на ноль или более операторов. Необязательный else
блок состоит из ключевого слова else
, за которым следует нулевая или более инструкций, заключенная в фигурные скобки, {
}
.
Будет выполнен первый блок, для которого condition
по результатам вычислений будет равняться true
. Блок else
(если он имеется) выполняется в том случае, если ни одно из условий не получает значение true
. Блок выполняется в собственной области, что означает, что все привязки, сделанные как часть блока, не отображаются после окончания блока.
Например, предположим, что 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]);
}
Вы также можете выразить простое ветвление в виде условного выражения.
Ограничения в определенных системах
Тесная интеграция между конструкциями потока управления и квантовыми вычислениями представляет собой проблему для современного квантового оборудования. Некоторые квантовые процессоры не поддерживают ветвление на основе результатов измерений. Поэтому сравнение значений типа Result
всегда приведет к ошибке компиляции для программ Q#, предназначенных для выполнения на таком оборудовании.
Другие квантовые процессоры поддерживают определенные виды ветвления на основе результатов измерений. Более общие if
выражения, поддерживаемые в Q# , компилируются в подходящие инструкции, которые можно запускать на таких процессорах. Введенные ограничения — это то, что значения типа Result
могут сравниваться только как часть условия в if
выражениях в операциях. Кроме того, блоки условного запуска не могут содержать выражения return
или обновлять изменяемые переменные, объявленные за пределами этого блока.