Die einzige in allen Sprachen konstante Weisheit ist: false = 0
Ich bleibe bei meiner Meinung, dass dies sprachlich nicht richtig ist.
Da gebe ich dir Recht. Korrekt müsste es heißen: Was der Delphi-Programmierer
false nennt, ist für die CPU eine 0.
Und ich glaube an die Macht des Debuggers, der mir bestätigt, das "False" eben nicht 0 ist.
Der Debugger macht hier das genaue Gegenteil des Compilers und übersetzt die Werte im Speicher in für Delphi-Programmierer lesbare Bezeichner.
Netterweise bietet Delphi ja eine Funktion, mit der man die internen Werte beliebiger Aufzählungstypen auch in Delphi ermitteln kann: Ord()
Im Gegensatz zu anderen Funktionen ändert Ord nämlich nicht die interne Darstellung sondern ist eher mit einem Hardcast vergleichbar, der einzig dafür da ist, den Compiler zu überreden einen Wert (false oder true) als einen anderen Typ zu betrachten, als der er deklariert ist (hier ein Boolean als Byte).
Noch klarer wird es, wenn man sich mal das Assemblerlisting beider Vergleiche ansieht:
Delphi-Quellcode:
Project16.dpr.22: if B then begin
004D28F1 807DFF00 cmp byte ptr [ebp-$01],$00
004D28F5 742D jz $004d2924
Project16.dpr.29: if B = true then begin
004D294F 807DFF01 cmp byte ptr [ebp-$01],$01
004D2953 752D jnz $004d2982
Im ersten Fall wird mit 0 verglichen und im Erfolgsfall gesprungen. Der
then-Teil wird also nur ausgeführt, wenn der Vergleich mit 0 fehlschlägt.
Beim zweiten Fall wird aber mit 1 verglichen und im Fehlerfall gesprungen. Damit wird der
then-Teil nur ausgeführt, wenn der Vergleich mit 1 erfolgreich ist.
Fazit:
- die interne Darstellung von false ist 0
- die interne Darstellung von true ist 1
- bei einem if <Boolean> then wird auf not false geprüft
- bei einem if (<Boolean> = <Boolean>) then wird auf Gleichheit der internen Darstellung geprüft
Die beiden ersten Punkte sind übrigens auch sinngemäß in der Delphi-Dokumentation nachzulesen:
Zitat:
Ein Boolean-Wert gilt als True, wenn seine Ordinalposition 1 ist, und als False, wenn seine Ordinalposition 0 (Null) ist.