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.