Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Reihenfolge des Operators 'and'


[r2d2] - Mi 25.02.04 03:14
Titel: Reihenfolge des Operators 'and'
Hi
In der Delphi5-Hilfe steht zu 'and' und 'or':

Der Delphi-Compiler unterstützt zwei Auswertungsmodi für die Operatoren and und or: die vollständige Auswertung und das Kurzschlußverfahren. Bei der vollständigen Auswertung werden alle Operanden eines and - oder or-Ausdrucks auch dann ausgewertet, wenn das Resultat des gesamten Ausdrucks bereits feststeht. Das Kurzschlußverfahren geht streng von links nach rechts vor und wird beendet, sobald das Ergebnis des gesamten Ausdrucks feststeht.

So, und jetzt zu meinem Problem :arrow: :
Das bedeutet doch eigentlich, dass beim Kurzschlussverfahren das 'and' wie ein 'then if' wirkt. Jetzt habe ich mir gedacht, zur Optimierung eines meiner Programme ersetze ich einfach alle 'then ifs' durch 'ands'. Komischerweise ist der Effekt von Operation zu Operation aber total unterschiedlich: Anscheinend wird der Code bei Operationen, die am schnellsten in der vorgegebenen Reihenfolge ausgeführt werden, langsamer, bei den anderen schneller. Jetzt heißt es aber doch, dass das Kurzschlussverfahren "streng von links nach rechts" vorgeht :?: . Ich habe mir zum Überprüfen meiner Vermutung ein kleines Testprogramm geschrieben, in dem aber alles funktioniert wie es soll. Das Programm, in dem der Fehler auftritt, ist ziemlich komplex, kann es vielleicht damit zusammenhängen?

Danke schonmal


Chatfix - Mi 25.02.04 09:38

ist doch ganz einfach...

Kurzschlussverfahren:


Delphi-Quelltext
1:
if True and False and True then                    

Hier hört der Compiler nach dem ersten and auf, da der gesamte ausdruck bereits "False" ist.

Bei der Vollständigen auswertung wird aber bis zum letzten geprüft (obwohl schon feststeht das "False" rauskommt)

Hoffe das war einigermasen verständlich

in der Delphi Hilfe ist aber auch nen Bsp...


[r2d2] - Mi 25.02.04 13:31

Das ist mir schon klar, ich habe nur das Gefühl, dass der Compiler aus

Delphi-Quelltext
1:
if bla and fgh and asd then                    

gern mal

Delphi-Quelltext
1:
if fgh and bla and asd then                    

macht

Moderiert von user profile iconPeter Lustig: Code- durch Delphi-Tags ersetzt


Delete - Mi 25.02.04 19:01

Wenn 'fgh' eine Boolean-Variable ist aber 'bla' und 'asd' Funktionen, dann könnte ich mir schon denken, dass der Compiler zur Optimierung das am einfachsten auszuwertende nach vorne holt.


UC-Chewie - Mi 25.02.04 19:55

Kann ich mir nicht vorstellen. Der Delphi-Code-Optimiererer ist i.d.R. sehr zurückhaltend, wenn es darum geht, die Auswirkungen des Codes zu verändern.
Aber probieren geht über studieren: Wenn du mal eine entsprechenden Stelle hast, an der scheinbar die Reihenfolge der Bedimgungen vertauscht ist, schalte mal die Codeoptimierung ab und prüfe, ob das Problem immer noch auftritt.