![]() |
Ausführung von links nach rechts?
Hallo Zusammen...
War es nicht so, dass man sich auf die Ausführungsreihenfolge verlassen konnte? Ohne zu Testen: In welcher Reihenfolge werden die Funktionen ausgeführt?
Delphi-Quellcode:
Eigentlich egal, oder?
var
S : String; begin S := Foo1(Foo2('Hallo')) + Foo3; end;
Delphi-Quellcode:
Jetzt schon nicht mehr...
var
S : String; Foo : TFooObject; begin S := Foo1(Foo.SetName('Peter',fpMann)) + Foo.GetAnrede; end; Mavarik :coder: PS.: Ja, man sollte sowas nicht machen und ja, irgendwo stand mal, dass die Ausführungsreihenfolge nicht sichergestellt ist... Aber war es nicht immer so? |
AW: Ausführung von links nach rechts?
Nein, die Parameter evaluation order in Delphi ist undefiniert.
|
AW: Ausführung von links nach rechts?
Zitat:
Aber ich weis das ich vor vielen Jahren das mal getestet habe und die Reihenfolge war immer von links nach rechtes... Hab gerade so alten Sourcecode gefunden der früher mal lief... Hat sich im Compiler doch mehr geändert als man denkt... :stupid: |
AW: Ausführung von links nach rechts?
Zitat:
|
AW: Ausführung von links nach rechts?
Zitat:
Mavarik |
AW: Ausführung von links nach rechts?
Ich kenn jetzt nicht alle Compiler und Programmiersprachen, aber die einzige, die ich kenne, wo das definiert von links nach rechts läuft, ist C# (
![]() |
AW: Ausführung von links nach rechts?
Meistens geht es von links nach rechts, da Delphi den Code "normalerweise" in der Weise auswertet und in Code umwandelt, in welcher er vom Compiler gelesen wird.
Aber es kann dennoch sein, dass es anders abläuft, sei es durch Codeoptimierung oder durch typbedingte Erweiterungen. Ich hatte mal den Fall, dass ein
Delphi-Quellcode:
anders abläuft.
a AND b
Eigentlich wird meistens erst a ausgwertet und dann b, falls a True ist, ABER wenn Eines von Beiden ein Variant ist, dann wird zuerst Beides ausgewertet, in Variants umgewandelt und danach wird die das AND nicht als Assembler AND, sondern als Funktion VarAnd ausgewertet, deswegen auch zuerst die komplette Parameterauflösung. :wall: Der Code war sowas wie
Delphi-Quellcode:
.
if (Wert <> '') and Auswerten(Wert) then ...
|
AW: Ausführung von links nach rechts?
Wow, netter Fallstrick :-D
Man könnte auch sagen: Wer mir Variants arbeitet hat all die Schmerzen verdient die daraus entstehen :twisted: |
AW: Ausführung von links nach rechts?
Zitat:
In ![]() ![]() ![]() ![]() In ![]() ![]() Hab das alles nur kurz überflogen, korrigiert mich wenn was falsch ist. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:27 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