Bedingungsverzweigung
Die bedingte Verzweigung wird in Form von if
Ausdrücken ausgedrückt. Ein if
Ausdruck besteht aus einer if
Klausel, gefolgt von null oder mehr elif
Klauseln und optional einem Else-Block. Jede Klausel hat das folgende Muster:
keyword condition {
<statements>
}
keyword
wird dabei durch if
oder elif
ersetzt, condition
ist ein Ausdruck vom Typ Bool
, und <statements>
muss durch null oder mehr Anweisungen ersetzt werden. Der optionale else
-block besteht aus dem Schlüsselwort else
gefolgt von null oder mehr Anweisungen, die in geschweifte Klammern {
}
eingeschlossen sind.
Der erste Block, für den condition
die Auswertung true
ergibt, wird ausgeführt. Der else
-Block (sofern vorhanden) wird ausgeführt, wenn keine der Bedingungen als true
ausgewertet wird. Der Block wird in seinem eigenen Bereich ausgeführt, was bedeutet, dass alle Bindungen, die als Teil des Blocks vorgenommen werden, nach dem Ende des Blocks nicht sichtbar sind.
Angenommen, qubits
ist ein Wert vom Typ Qubit[]
und r1
und r2
sind vom Typ Result
.
if r1 == One {
let q = qubits[0];
H(q);
}
elif r2 == One {
let q = qubits[1];
H(q);
}
else {
H(qubits[2]);
}
Einfache Verzweigungen können auch in Form eines bedingten Ausdrucks ausgedrückt werden.
Zielspezifische Einschränkungen
Die enge Integration zwischen Ablaufsteuerungskonstrukten und Quantenberechnungen stellt eine Herausforderung für die aktuelle Quantenhardware dar. Bestimmte Quantenprozessoren unterstützen keine Verzweigung basierend auf Messergebnissen. Der Vergleich von Werten vom Typ Result
führt daher immer zu einem Kompilierungsfehler für Q#-Programme, die auf dieser Hardware ausgeführt werden sollen.
Andere Quantenprozessoren unterstützen bestimmte Arten von Verzweigungen basierend auf Messergebnissen. Die allgemeineren if
Q# unterstützten Ausdrücke werden in geeigneten Anweisungen kompiliert, die auf solchen Prozessoren ausgeführt werden können. Die auferlegten Einschränkungen sind, dass Werte des Typs Result
nur als Teil der Bedingung innerhalb von Ausdrücken in if
Vorgängen verglichen werden dürfen. Darüber hinaus können die bedingt ausgeführten Blöcke keine return
Ausdrücke enthalten oder veränderbare Variablen aktualisieren, die außerhalb dieses Blocks deklariert sind.