Menu

Zero If/Else: Bedingte Verzweigung erklärt

Wie if und else in Zero funktionieren: boolesche Bedingungen, Branch-Bodies, das Fehlen impliziter Wahrheitswerte und wie sich Konditionale neben match für reichhaltigere Verzweigung einfügen.

Diese Seite enthält ausführbare Editoren. Bearbeiten, ausführen und Ausgabe sofort sehen.

Die Grundlagen

if in Zero sieht ungefähr aus wie if in jeder anderen Sprache der C-Familie, mit einer nennenswerten Einschränkung: Die Bedingung muss ein bool sein.

Die Bedingung value == 42 ist ein bool, weil == zwischen zwei i32s einen bool zurückgibt. Beide Zweige enthalten jeweils einen Block aus Statements. Einer der Zweige darf weggelassen werden – das else ist optional – aber wenn beide vorhanden sind, müssen es jeweils { ... }-Blöcke sein.

Die bool-Pflicht

Manche Sprachen erlauben if value { ... } und behandeln 0, "" oder null als falsy. Zero nicht. Die Bedingung muss ein echter bool sein.

let count = 0
if count {              // Compile-Fehler: bool erwartet, i32 erhalten
    // ...
}

if count == 0 {         // OK
    check world.out.write("nothing to do\n")
}

Der Grund ist derselbe wie überall sonst in der Sprache: explizit schlägt implizit. Ein Agent, der die zweite Form liest, weiß genau, was geprüft wird. Die erste Form lässt die Wahrheitsregeln implizit und sie unterscheiden sich zwischen Sprachen – Zero verzichtet darauf.

Else und Else-If

Die else-Klausel läuft, wenn die Bedingung falsch ist:

Bedingungen kettest du mit else if:

if value < 0 {
    check world.out.write("negative\n")
} else if value == 0 {
    check world.out.write("zero\n")
} else {
    check world.out.write("positive\n")
}

else if ist nichts anderes als else { if ... } ohne die Klammern – dieselbe Semantik, weniger Einrückung. Das abschließende else ist optional.

Woraus die Bedingung kommt

Die Bedingung kann alles sein, was zu bool auswertet:

  • Ein bool-Binding: if ok { ... }.
  • Ein Vergleich: if value == 42 { ... }, if x < y { ... }.
  • Eine logische Kombination: if a && b { ... }, if pair.left == 1_u8 && pair.right == 2_u8 { ... }.
  • Ein Funktionsaufruf, der bool zurückgibt: if isReady(world) { ... }.

Ein praxisnahes Snippet aus den Beispielen der Sprache:

let pair: BytePair = Pair { left: 1_u8, right: 2_u8 }
if pair.left == 1_u8 && pair.right == 2_u8 {
    check world.out.write("type alias ok\n")
} else {
    check world.out.write("type alias broke\n")
}

&& short-circuited so, wie du es erwartest – ist die linke Seite false, wird die rechte nicht ausgewertet. Genauso für ||.

Wann stattdessen match

if/else if-Ketten sind okay für binäre oder Drei-Wege-Entscheidungen, vor allem wenn die Bedingungen keine gemeinsame Struktur teilen. Aber wenn du über die Varianten eines Summentyps – einer Choice oder eines Enums – verzweigst, ist match das richtige Werkzeug.

Vergleich:

// match – erschöpfend, vom Compiler geprüft
match result {
    .ok  => value   { check world.out.write("ok\n") }
    .err => message { check world.out.write("err\n") }
}

vs.

// if/else über einen Summentyp – ausführlicher und fehleranfälliger
if result.isOk() {
    let value = result.unwrap()
    check world.out.write("ok\n")
} else {
    check world.out.write("err\n")
}

Die match-Form macht die Variantenanalyse explizit, und der Compiler meckert, wenn später eine Variante hinzukommt und du vergisst, sie zu behandeln. Die if-Form lässt alles, was nicht ok ist, stillschweigend in den else-Zweig fallen, auch brandneue Varianten, an die du nie gedacht hast.

Faustregel: if für Booleans, match für Varianten.

Stil-Hinweise

Ein paar kleine Konventionen, die Code für Menschen wie Agenten leichter lesbar machen:

  • Body immer in geschweifte Klammern. Auch ein einzeiliger Body kommt in { ... }. Es gibt keine klammerlose Einzelanweisungs-Form. Das ist Absicht – es hält die Einrückung verlässlich und nimmt eine häufige Bug-Quelle in der C-Familie weg.
  • Setz den häufigsten Branch nach oben. Leser (und Agenten) scannen von oben nach unten.
  • Bevorzuge positive Bedingungen, wenn sie genauso klar sind. if isReady liest sich leichter als if !notReady, sonst alles gleich.

Als Nächstes: While-Schleifen

Konditionale entscheiden was getan wird; Schleifen entscheiden wie oft. Das nächste Dokument behandelt Zeros While-Schleifen, das frühe Loop-Konstrukt, mit dem die Sprache kommt.

Häufig gestellte Fragen

Wie funktionieren If-Anweisungen in Zero?

Verwende if condition { ... } mit einer optionalen else { ... }-Klausel. Die Bedingung muss ein bool sein – Zero konvertiert Integer, Strings oder andere Werte nicht in einen Boolean. Beispiel: if value == 42 { check world.out.write("yes\n") } else { check world.out.write("no\n") }.

Hat Zero einen Ternär-Operator?

Zero hält die Oberfläche bewusst klein und verwendet if/else-Blöcke statt eines separaten condition ? a : b-Ternärs. Die offiziellen Beispiele bevorzugen explizite Branches selbst für kurze Fälle. Wenn deine Sprache if-als-Ausdruck unterstützt, geht Zero eher in diese Richtung, statt eine zweite Syntax einzuführen.

Kann man if/else if in Zero verketten?

Ja. Verkette Bedingungen mit else if zwischen den Branches: if a { ... } else if b { ... } else { ... }. Für aufwendigere Verzweigung über eine choice oder ein enum greif stattdessen zu match – das ist erschöpfend, und der Compiler prüft, dass du jede Variante behandelt hast.

Warum konvertiert Zero Werte nicht zu bool?

Zeros Designphilosophie ist „alles ist explizit“. Implizite Wahrheitswerte – 0, "" oder null als falsch zu behandeln – sind eine häufige Bug-Quelle und für einen Agenten schwer präzise zu durchdenken. Ein echtes bool zu verlangen macht die Verzweigungsentscheidung im Quellcode sichtbar und maschinell leicht verifizierbar.

Wann sollte man match statt if/else verwenden?

Nimm match, wenn du über die Varianten einer choice oder eines enum verzweigst. Der Compiler kann verifizieren, dass du jeden Fall abgedeckt hast – das können if/else if-Ketten nicht. Behalte if/else für einfache boolesche Prädikate – Gleichheitschecks, Vergleiche und kurze Zwei-Wege-Verzweigungen.

Illustration der Programmiersprachen bei Coddy

Lerne mit Coddy zu programmieren

Los geht's