Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Auswertung von Boolschen Ausdrücke
Gausi - Sa 08.03.03 16:20
Titel: Auswertung von Boolschen Ausdrücke
Hab mal ne Frage, wie intelligent in Delphi (bzw. im fertigen Programm) Boolsche Ausdrücke auswertet werden. Ich hab nen Anweisungsblock, der nur dann ausgeführt werden soll, wenn 2 Bedingungen erfüllt sind. Das geht natürlich so:
Quelltext
1: 2: 3: 4:
| if (Bed1) AND (Bed2) then begin ... end; |
Problem ist: Wenn Bed1 schon nicht erfüllt ist, kann es beim Testen, ob Bed2 erfüllt ist, zu einem "List INdex out of Bounds" kommen.
Frage: Bricht die Auswertung bei einem Ausdruck der Form if (Bed1) AND (Bed2)
sofort mit FALSE ab, wenn Bed1=False (was ja korrekt wäre), oder macht der trotzdem weiter?
(Bei mir scheint das so zu sein, denn wenn ich die Bedingungen umkehre, krieg ich den Fehler, anders nicht; aber ist dieses Verhalten auch auf anderen Rechnern garantiert, wenn ich die fertige .exe verteile?)
Popov - Sa 08.03.03 16:28
Guck dir mal im Menü "Projekt > Optionen > Compiler > Boolisch Ausdrücke vollständig" an oder die Compilerschalter $B.
| Zitat: |
BOOLEVAL
Typ Schalter
Syntax {$B+} oder {$B-}
{$BOOLEVAL ON} oder {$BOOLEVAL OFF}
Vorgabe {$B-}
{$BOOLEVAL OFF}
Gültigkeitsbereich Lokal
Anmerkungen
Die Direktive $B schaltet zwischen zwei unterschiedlichen Modellen der Code-Generierung für die booleschen Operatoren and und or um.
Im Status {$B+} erzeugt der Compiler Code für die vollständige Auswertung eines Booleschen Ausdrucks. Das bedeutet, daß jeder Operand eines Booleschen Ausdrucks, der mit den Operatoren and und or gebildet wird, garantiert ausgewertet wird, auch wenn das Ergebnis des gesamtes Ausdrucks bereits feststeht.
Im Status {$B-} generiert der Compiler Code für die Kurzschlußauswertung Boolescher Ausdrücke, d.h. die Auswertung wird beendet, sobald das Ergebnis des gesamten Ausdrucks feststeht (die Auswertung erfolgt immer von links nach rechts). |
DaFox - Sa 08.03.03 16:33
Titel: Re: Auswertung von Boolschen Ausdrücke
Hi.
| Gausi hat folgendes geschrieben: |
Frage: Bricht die Auswertung bei einem Ausdruck der Form if (Bed1) AND (Bed2)
sofort mit FALSE ab, wenn Bed1=False
|
Kommt auf die Optionen an. Aber eigentlich ist das Sinn der Sache, denn der Ausdruck kann nicht mehr true ergeben und die Überprüfung der restlichen Bedingungen wäre unnütz.
| Gausi hat folgendes geschrieben: |
(Bei mir scheint das so zu sein, denn wenn ich die Bedingungen umkehre, krieg ich den Fehler, anders nicht; aber ist dieses Verhalten auch auf anderen Rechnern garantiert, wenn ich die fertige .exe verteile?)
|
Wenn das bei Dir so ist, ist es auch auf anderen Systemen so, weil es eine Sache des Compilers ist und diese Einstellungen ("Boolesche Ausdrücke vollständig auswerten" oder "Complete Boolean Eval" muss/sollte immer aus sein) gelten dann intern für Deine ganze Applikation.
Gruß,
Markus
Wolff68 - Mo 10.03.03 22:08
| DaFox hat folgendes geschrieben: |
| denn der Ausdruck kann nicht mehr true ergeben und die Überprüfung der restlichen Bedingungen wäre unnütz. |
Nicht, wenn Du Funktionen mit Bool-Rückgabewerten verwendest, die auch noch andere Dinge verändern.
Da kann es schon mal wichtig sein, daß die Funktion ausgeführt wird.
OK. Mag ein Sonderfall sein, aber genau dafür kann man dann mit {$R+} die komplette Ausführung erzwingen.
In der Regel hast Du recht: Es macht keinen Sinn. Weshalb der Vorgabewert ja auch {$R-} ist.
DaFox - Di 11.03.03 15:03
Wolff68, das ist richtig, aber ich rate davon ab. Jeder gute Source, jeder gute Programmierer verzichtet auf die vollständige Auswertung von Booleschen Ausrücken.
Ich verstehe auch nicht, dass jeder sein Programm geschwindigkeitsmäßig optimieren möchte, dann aber immer wieder eine Diskussion aufkommt, in der jmd erklärt wie wichtig es sein kann, dass man diese Compileroption benutzt. Die Funktion würde evtl. ausgeführt werden und es wäre wichtig für den weiteren Ablauf Deines Programms (wenn Du's so programmiert hast) aber der Ausdruck liefert trotzdem false zurück und somit war diese Konstruktion unglücklich gewählt.
Außerdem: Stell der mal das Debuggen eines solchen Konstrukts vor! :shock: Pfui; Ich verurteile niemanden, der so programmiert, aber ich mache das nicht und somit werde ich mich hüten jemandem diesen Programmierstil zu empfehlen.
Gruß,
Markus
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!