Programmieren mit Boolean-Werten
- Boolesche Logik – Grundlagen
- Programmieren mit Boolean-Werten
- Typische Anfängerfehler
Genug der grauen Theorie. Sehen wir uns nun einmal an, wo uns beim Programmieren überall Boolean-Werte begegnen:
Boolean-Variablen
1 2 | var b: Boolean; |
Boolean-Variablen werden genau so deklariert, wie Integer und Stringvariablen z.B. auch. Rechnen kann man damit wie oben beschrieben mit den Operatoren and, or, not, xor und =. Dabei ist auch die Klammerung wichtig. Also im Zweifelsfall lieber mehr Klammern setzen…
Funktionsrückgabewert
Viele Funktionen liefern als Ergebnis einen Boolean-Wert zurück. Dieser lässt sich dann auch in einer Variablen speichern:
1 2 3 4 5 6 | var ok: Boolean; begin ok := OpenDialog1.Execute; // Execute() gibt einen Boolean-Wert zurück// oder gleich auswerten: if SaveDialog1.Execute then SaveFile; |
Properties
1 2 | if CheckBox1.Checked then ... |
Boolean-Ausdrücke
1 2 | if a > b then DoSth; |
a > b
ist hierbei ein Boolean-Ausdruck. Dieser ist genau dann True, wenn a größer als b ist… 😉
Kurzschluss?
Zur Auswertung von Boolean-Ausdrücken ist noch folgendes zu sagen:
Bei if a and b then
wird u.U. b gar nicht mehr geprüft, wenn a schon false ist. Ebenso ist es mit if a or b
Hier wird die Auswertung unterbrochen, wenn a schon true ist. Dieses Verhalten wird manchmal Kurzschluss-Auswertung (short-circuit evaluation) genannt. In den Projektoptionen (Projekt–>Optionen–>Compiler–>Vollst. Boolesche Auswertung) kann man dieses Verhalten abstellen. Dies ist jedoch nicht zu empfehlen, da die VCL diese teilweise recht ausgiebig nutzt. Über entsprechende Compiler-Direktiven lässt sich die Kurzschlussauswertung auch für bestimmte Code-Teile separat ausschalten:
1 2 | {$B} // Vollständige Auswertung {$B-} // Kurzschluss-Auswertung; default |
Am einfachsten (und übersichtlichsten) ist es jedoch, wenn man entsprechende If-Anweisungen einfach schachtelt:
1 2 3 4 5 6 7 8 9 10 11 12 | if Assigned(Objekt) then begin if Objekt.Eigenschaft then begin ... end; end; // statt if (Assigned(Objekt)) and (Objekt.Eigenschaft) then begin ... end; |
So ist auf jeden Fall sicher gestellt, dass auf das Objekt nur zugegriffen wird, wenn dieses auch wirklich existiert…