Freigeben über


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.