Share via


Ramificação condicional

A ramificação condicional é expressa sob a forma de if expressões. Uma if expressão consiste numa if cláusula, seguida de zero ou mais elif cláusulas e opcionalmente um bloco else. Cada cláusula segue o padrão

keyword condition {
    <statements>
}

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

O primeiro bloco para o qual a condition avalia true será executada. O else bloco, se estiver presente, é executado se nenhuma das condições for avaliada como true. O bloco é executado no seu próprio âmbito, o que significa que quaisquer enlaces efetuados como parte do bloco não são visíveis após o fim do bloco.

Por exemplo, suponha que qubits é o valor do tipo Qubit[] e r1 e r2 é 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 pode expressar ramificações simples sob a forma de uma expressão condicional.

Restrições específicas do destino

A integração estreita entre construções de fluxo de controlo e cálculos quânticos constitui um desafio para o hardware quântico atual. Determinados processadores quânticos não suportam a ramificação com base nos resultados da medição. Como tal, a comparação de valores do tipo Result resultará sempre num erro de compilação para Q# programas direcionados para serem executados nesse hardware.

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