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 folgt dem Muster.
keyword condition {
<statements>
}
wird keyword
durch if
bzw. elif
ersetzt, ist condition
ein Ausdruck vom Typ Bool
, und <statements>
soll 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 die condition
als true
ausgewertet wird. Wenn vorhanden, wird der else
-Block ausgeführt, wenn keine der Bedingungen 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 der Wert vom Typ Qubit[]
und r1
und r2
vom Typ Result
sind.
if r1 == One {
let q = qubits[0];
H(q);
}
elif r2 == One {
let q = qubits[1];
H(q);
}
else {
H(qubits[2]);
}
Sie können auch einfache Verzweigungen in Form eines bedingten Ausdrucksausdrücken.
Zielspezifische Einschränkungen
Die enge Integration zwischen Steuerflusskonstrukten 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 immer zu einem Kompilierungsfehler für Q# Programme, die auf einer solchen Hardware ausgeführt werden sollen.
Andere Quantenprozessoren unterstützen bestimmte Arten von Verzweigungen basierend auf Messergebnissen. Die allgemeineren if
in 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 vom Typ Result
nur als Teil der Bedingung innerhalb if
Ausdrücke in 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.