Delphi-PRAXiS
Seite 5 von 5   « Erste     345   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   TRUE/FALSE Part (https://www.delphipraxis.net/184484-true-false-part.html)

Neutral General 2. Apr 2015 09:11

AW: TRUE/FALSE Part
 
Okay BadenPower:

Delphi-Quellcode:
var
  B: Boolean;
begin
  B := false;
end;
Was steht jetzt für B im Speicher?

00000000

oder

000false

? (Kleiner Tipp: Ein Bit kann nur den Zustand 1 oder 0 annehmen)

BadenPower 2. Apr 2015 09:17

AW: TRUE/FALSE Part
 
Zitat:

Zitat von Neutral General (Beitrag 1295925)
(Kleiner Tipp: Ein Bit kann nur den Zustand 1 oder 0 annehmen)

Ein String besteht auch nur aus 0 und 1.

Und einer Bitfolge siehst Du halt nicht an, was es letztendlich darstellen soll.

Uwe Raabe 2. Apr 2015 09:42

AW: TRUE/FALSE Part
 
Zitat:

Zitat von BadenPower (Beitrag 1295924)
Zitat:

Zitat von Medium (Beitrag 1295891)
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.


Zitat:

Zitat von BadenPower (Beitrag 1295924)
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.

BadenPower 2. Apr 2015 10:07

AW: TRUE/FALSE Part
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1295933)
Zitat:

Zitat von BadenPower (Beitrag 1295924)
Zitat:

Zitat von Medium (Beitrag 1295891)
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.

Na wenigstens einer der mich versteht.

Daniel 2. Apr 2015 10:20

AW: TRUE/FALSE Part
 
Bei allem Respekt, meine Herren - aber ein bisschen "nerdig" ist es schon, sich fünf Seiten lang über sprachliche Spitzfindigkeiten von boolschen Werten auszuschauen.

Grundsätzlich bin ich ein Freund der korrekten Sprache und halte eine präzise Ausdrucksweise auch für hilfreich, aber irgendwann langt's doch mal, oder?

EWeiss 2. Apr 2015 10:22

AW: TRUE/FALSE Part
 
Zitat:

Zitat von Daniel (Beitrag 1295947)
Bei allem Respekt, meine Herren - aber ein bisschen "nerdig" ist es schon, sich fünf Seiten lang über sprachliche Spitzfindigkeiten von boolschen Werten auszuschauen.

Grundsätzlich bin ich ein Freund der korrekten Sprache und halte eine präzise Ausdrucksweise auch für hilfreich, aber irgendwann langt's doch mal, oder?

Habe ein Feedback gestellt damit der Thread geschlossen wird.
Wenn ich es selbst könnte hätte ich es nach der ersten Seite schon getan.
Da war meine Frage schon beantwortet.

gruss

himitsu 2. Apr 2015 10:28

AW: TRUE/FALSE Part
 
Zitat:

siehe Bild im Anhang.
Ja und?

Es liegt einfach daran, daß es einen speziellen Debughelper gibt, welcher den Wert des Boolean-Typen interpretiert und entsprechend anzeigt.
Dabei wird der Boolean "korrekt" ausgewertet und nicht einfach nur angezeigt. Man könnte sich jetzt streiten, ob er hier nicht vielleicht besser ein "True (2)" anzeigen sollte, aber wer will, kann das bei sich gern ändern.

Delphi-Quellcode:
var
  B: Boolean;
  A: TAlignLayout;
begin
  B := True;       // True
  B := Boolean(2); // True

  A := TAlignLayout.Top; // Top
  A := TAlignLayout(99); // (außerhalb des zulässigen Bereichs) 99

  if B then ;
  if A = TAlignLayout.Top then ;
  if A = 99 then ; // das mag der Compiler auch nicht, obwohl es "intern" 99 ist

Caps 2. Apr 2015 21:25

AW: TRUE/FALSE Part
 
Zitat:

Zitat von himitsu (Beitrag 1295899)
Zitat:

Beachten Sie, dass die Zuweisungsanweisung newCustomer = True wie der Ausdruck im vorherigen Beispiel aussieht. Sie führt jedoch eine andere Funktion aus und wird auf eine andere Art verwendet. ...
Code:
If newCustomer = True Then
   newCustomer = False
End If

Darum haben in Delphi/Pascal die Zuweisungen und Vergleiche unterschiedliche Operatoren, damit man das nicht verwechseln kann und nicht das Selbe raus kommt, so wie in PHP. :stupid:
PHP-Quellcode:
If (newCustomer = True) {
    newCustomer = False
}
Was macht denn !!?

Normalerweise schreibt man für einen Vergleich ja auch "==". Dass Zuweisungen selbst einen Wert haben, ist eher ein Feature für faule Programmierer ;-).

lg Caps


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:01 Uhr.
Seite 5 von 5   « Erste     345   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz