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 in geschweiften Klammern ({}).

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, d. h. alle Bindungen, die als Teil des Blocks vorgenommen werden, sind nach dem Ende des Blocks nicht sichtbar.

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 Ausdrücke, die in Q# unterstützt werden, werden in geeignete 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 if von Ausdrücken in Vorgängen verglichen werden dürfen. Darüber hinaus dürfen die Blöcke mit bedingter Ausführung keine return Ausdrücke enthalten oder veränderliche Variablen aktualisieren, die außerhalb dieses Blocks deklariert werden.