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.

Coddy programming languages illustration

Lerne mit Coddy zu programmieren

LOS GEHT'S