Compartilhar via


Ramificação condicional

A ramificação condicional é expressa na forma de if expressões. Uma if expressão consiste em uma if cláusula, seguida por zero ou mais elif cláusulas e, opcionalmente, um else-block. Cada cláusula segue o padrão

keyword condition {
    <statements>
}

em que keyword é substituído por if ou elif, respectivamente, condition é uma expressão do tipo Bool, e <statements> deve ser substituído por zero ou mais instruções. O bloco opcional elseconsiste na palavra-chave else seguida por zero ou mais instruções entre chaves, { }.

O primeiro bloco em que a condition for avaliada como true será executado. O bloco else, se estiver presente, será executado se nenhuma das condições for avaliada como true. O bloco é executado em seu próprio escopo, o que significa que quaisquer associações feitas como parte do bloco não são visíveis após o término do bloco.

Por exemplo, suponha que qubits seja o valor do tipo Qubit[] e r1, e r2 seja do tipo Result.

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

Também é possível expressar a ramificação simples na forma de uma expressão condicional.

Restrições específicas do destino

Uma forte integração entre os constructos de fluxo de controle e as computações quânticas representa um desafio para os hardwares quânticos atuais. Alguns processadores quânticos não dão suporte à ramificação com base nos resultados da medida. Portanto, a comparação de valores do tipo Result sempre resultará em um erro de compilação para programas Q# com execução direcionada a esses hardwares.

Outros processadores quânticos dão suporte a tipos específicos de ramificação com base nos resultados da medida. As expressões mais gerais if suportadas em Q# são compiladas em instruções adequadas que podem ser executadas em tais processadores. As restrições impostas são que os valores do tipo Result só podem ser comparados como parte da condição dentro if de expressões em operações. Além disso, os blocos executados condicionalmente não podem conter nenhuma return expressão ou atualizar variáveis mutáveis declaradas fora desse bloco.