Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Auswertung von logisch verknüpften Statements (https://www.delphipraxis.net/123561-auswertung-von-logisch-verknuepften-statements.html)

Xong 4. Nov 2008 13:46


Auswertung von logisch verknüpften Statements
 
Hallo lieber DPler!

Wie wertet der Compiler logisch verknüpfte Boolsche Variablen aus?

Dazu folgendes Beispiel:
Delphi-Quellcode:
function tueDies : Boolean;
begin
  // Mach was...
  Result := True;
end;

function tueDas : Boolean;
begin
  // Mach noch was...
  Result := False;
end;
Was passiert nun bei folgendem Code?
Delphi-Quellcode:
if tueDies OR tueDas then // ergibt True OR False := True
  foo := 'bar';
In (ANSI-)C/C++ würde tueDas nicht aufgerufen werden, da das Statement in der IF-Bedingung sowieso wahr sein wird.
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

Bernhard Geyer 4. Nov 2008 13:49

Re: Auswertung von logisch verknüpften Statements
 
Die Compilereinstellung "Boolsche Ausdrücke vollständig" steuert das verhalten ob die Auswertung frühzeitig abgebrochen wird.

Xong 4. Nov 2008 13:58

Re: Auswertung von logisch verknüpften Statements
 
Zitat:

Zitat von Bernhard Geyer
Die Compilereinstellung "Boolsche Ausdrücke vollständig" steuert das verhalten ob die Auswertung frühzeitig abgebrochen wird.

Danke, Bernhard. Danach habe ich gesucht.

Und ein Zusatz aus der Delphi-Hilfe noch: Voreingestellt ist der Status {$B} für das Kurzschlussverfahren.

LG,
Xong

Medium 4. Nov 2008 14:09

Re: Auswertung von logisch verknüpften Statements
 
Praktisch ist das vor allem bei so Konstrukten wie:
Delphi-Quellcode:
  if Assigned(MyObject) and (MyObject.ValueA = ValueB) then ...
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.

Das aber nur so am Rande ohne Beitrag zur eigentlichen Frage ;)

SirThornberry 4. Nov 2008 14:18

Re: Auswertung von logisch verknüpften Statements
 
auf die Füße fallen kann einem das hingegen bei Sachen wie:
Delphi-Quellcode:
if variable or Funktionsaufruf() then
...
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.

nahpets 4. Nov 2008 14:44

Re: Auswertung von logisch verknüpften Statements
 
Hallo
Zitat:

Zitat von SirThornberry
auf die Füße fallen kann einem das hingegen bei Sachen wie:
Delphi-Quellcode:
if variable or Funktionsaufruf() then
...
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.

Oja, das Kurzschlussverfahren kann so seine Tücken haben.
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 10:07 Uhr.

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