Поделиться через


Условное ветвление

Условное ветвление выражается в форме выражений if . Выражение if состоит из if предложения , за которым следует ноль или более elif предложений и при необходимости — блока else. Каждое предложение следует шаблону:

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 или обновлять изменяемые переменные, объявленные за пределами этого блока.