Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Ausführung von links nach rechts? (https://www.delphipraxis.net/191689-ausfuehrung-von-links-nach-rechts.html)

Mavarik 10. Feb 2017 13:35

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:
var
  S : String;
begin
  S := Foo1(Foo2('Hallo')) + Foo3;
end;
Eigentlich egal, oder?

Delphi-Quellcode:
var
  S : String;
  Foo : TFooObject;
begin
  S := Foo1(Foo.SetName('Peter',fpMann)) + Foo.GetAnrede;
end;
Jetzt schon nicht mehr...

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?

Stevie 10. Feb 2017 13:45

AW: Ausführung von links nach rechts?
 
Nein, die Parameter evaluation order in Delphi ist undefiniert.

Mavarik 10. Feb 2017 14:04

AW: Ausführung von links nach rechts?
 
Zitat:

Zitat von Stevie (Beitrag 1361272)
Nein, die Parameter evaluation order in Delphi ist undefiniert.

Ja so hieß es immer... Wegen der "Optimierung"...

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:

Uwe Raabe 10. Feb 2017 14:28

AW: Ausführung von links nach rechts?
 
Zitat:

Zitat von Mavarik (Beitrag 1361274)
Aber ich weis das ich vor vielen Jahren das mal getestet habe und die Reihenfolge war immer von links nach rechtes...

Ich hatte kürzlich mal einen Fall, da war das sogar bei Win32 und Win64 unterschiedlich.

Mavarik 10. Feb 2017 15:10

AW: Ausführung von links nach rechts?
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1361278)
Zitat:

Zitat von Mavarik (Beitrag 1361274)
Aber ich weis das ich vor vielen Jahren das mal getestet habe und die Reihenfolge war immer von links nach rechtes...

Ich hatte kürzlich mal einen Fall, da war das sogar bei Win32 und Win64 unterschiedlich.

Macht man ja auch nicht... Das war so von früher... Lieber eine lokale Variable weniger... Könnte ja Speicher auf den Stack verbrauchen... (und Taktzyklen)...:lol:

Mavarik

Stevie 10. Feb 2017 16:09

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# (Quelle)

himitsu 10. Feb 2017 18:45

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:
a AND b
anders abläuft.
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 ...
.

Der schöne Günther 10. Feb 2017 19:01

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:

Valle 11. Feb 2017 13:26

AW: Ausführung von links nach rechts?
 
Zitat:

Zitat von Stevie (Beitrag 1361287)
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# (Quelle)

Das hat mich neugierig gemacht. Hier mal eine kurze Recherche:

In Python ist es definiert. In PHP ist es explizit undefiniert. In Ruby gibt es wohl keine explizite Aussage dazu. In Perl ist es zwar definiert aber trotzdem komisch. (also alles wie immer :stupid: )

In Go ist die Reihenfolge teilweise definiert (genug für den OP). Auch in Java ist die Reihenfolge fix.

Hab das alles nur kurz überflogen, korrigiert mich wenn was falsch ist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:12 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