![]() |
Auswertung von logisch verknüpften Statements
Hallo lieber DPler!
Wie wertet der Compiler logisch verknüpfte Boolsche Variablen aus? Dazu folgendes Beispiel:
Delphi-Quellcode:
Was passiert nun bei folgendem Code?
function tueDies : Boolean;
begin // Mach was... Result := True; end; function tueDas : Boolean; begin // Mach noch was... Result := False; end;
Delphi-Quellcode:
In (ANSI-)C/C++ würde tueDas nicht aufgerufen werden, da das Statement in der IF-Bedingung sowieso wahr sein wird.
if tueDies OR tueDas then // ergibt True OR False := True
foo := 'bar'; Wie reagiert der Delphi-Compiler? Gibt es einen festgelegten Standard? Ich danke für eure Hilfe. LG, Xong PS: Konkreter Hintergrund der Frage ist zum einen pures Interesse und zum anderen das Überprüfen und Anlegen eines Verzeichnisses:
Delphi-Quellcode:
if VerzeichnisExistiert(DirName) OR LegeVerzeichnisAn(DirName) then
// Verzeichnis existiert, also kann damit gearbeitet werden else // Verzeichnis existiert nicht -> Fehlermeldung |
Re: Auswertung von logisch verknüpften Statements
Die Compilereinstellung "Boolsche Ausdrücke vollständig" steuert das verhalten ob die Auswertung frühzeitig abgebrochen wird.
|
Re: Auswertung von logisch verknüpften Statements
Zitat:
Und ein Zusatz aus der Delphi-Hilfe noch: Voreingestellt ist der Status {$B} für das Kurzschlussverfahren. LG, Xong |
Re: Auswertung von logisch verknüpften Statements
Praktisch ist das vor allem bei so Konstrukten wie:
Delphi-Quellcode:
Man muss nur drauf achten immer brav FreeAndNil() zu nutzen bzw. das "Nilen" nicht zu vergessen. Da aber FreeAndNil bei mir in Fleisch und Blut ist, nutz ich sowas ganz gerne. Bei vollständiger Auswertung würd es eben ggf. knallen, oder man müsste zwei Statements draus machen.
if Assigned(MyObject) and (MyObject.ValueA = ValueB) then ...
Das aber nur so am Rande ohne Beitrag zur eigentlichen Frage ;) |
Re: Auswertung von logisch verknüpften Statements
auf die Füße fallen kann einem das hingegen bei Sachen wie:
Delphi-Quellcode:
Denn wenn man in dem Funktionsaufruf die Variable ändert etc. und nicht bedenkt das die Funktion eventuell nicht aufgerufen wird kommen tolle Effekte zu stande.
if variable or Funktionsaufruf() then
... |
Re: Auswertung von logisch verknüpften Statements
Hallo
Zitat:
Es ist praktisch, wenn man zuerst eine Variabel und dann ein (nicht initialisiertes) Objekt abfragt. Da kommt man dann schonmal an 'ner Schutzverletzung vorbei. Aber ansonsten muss man bei der Reihenfolge der abzufragenden Werte schonmal höllisch aufpassen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:13 Uhr. |
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