Dela via


Villkorlig branchning

Villkorsstyrd förgrening uttrycks i form av if uttryck. Ett if uttryck består av en if sats, följt av noll eller fler elif satser och eventuellt ett else-block. Varje sats följer mönstret

keyword condition {
    <statements>
}

där keyword ersätts med if eller elif respektive är condition ett uttryck av typen Bool, och <statements> ska ersättas med noll eller fler instruktioner. Det valfria else-blocket består av nyckelordet else följt av noll eller fler instruktioner som omges av klammerparenteser, { }.

Det första blocket som condition utvärderas till true körs för. Blocket else , om det finns, körs om inget av villkoren utvärderas till true. Blocket körs i sitt eget omfång, vilket innebär att bindningar som görs som en del av blocket inte visas när blocket har upphört.

Anta till exempel att qubits är värdet av typen Qubit[] och r1 r2 är av typen Result,

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

Du kan också uttrycka enkel förgrening i form av ett villkorsuttryck.

Målspecifika begränsningar

Den snäva integreringen mellan kontrollflödeskonstruktioner och kvantberäkningar utgör en utmaning för den aktuella kvantmaskinvaran. Vissa kvantprocessorer stöder inte förgrening baserat på mätresultat. Därför resulterar jämförelse för värden av typen Result alltid i ett kompileringsfel för Q# program som är avsedda att köras på sådan maskinvara.

Andra kvantprocessorer stöder specifika typer av förgrening baserat på mätresultat. De mer allmänna if uttryck som stöds i Q# kompileras till lämpliga instruktioner som kan köras på sådana processorer. De angivna begränsningarna är att värden av typen Result endast kan jämföras som en del av villkoret i if uttryck i åtgärder. Dessutom kan de villkorliga körningsblocken inte innehålla några return uttryck eller uppdatera föränderliga variabler som deklareras utanför blocket.