AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Ausführung von links nach rechts?
Thema durchsuchen
Ansicht
Themen-Optionen

Ausführung von links nach rechts?

Ein Thema von Mavarik · begonnen am 10. Feb 2017 · letzter Beitrag vom 11. Feb 2017
Antwort Antwort
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.143 Beiträge
 
Delphi 10.3 Rio
 
#1

Ausführung von links nach rechts?

  Alt 10. Feb 2017, 14:35
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

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?
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.016 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#2

AW: Ausführung von links nach rechts?

  Alt 10. Feb 2017, 14:45
Nein, die Parameter evaluation order in Delphi ist undefiniert.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.143 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Ausführung von links nach rechts?

  Alt 10. Feb 2017, 15:04
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...
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#4

AW: Ausführung von links nach rechts?

  Alt 10. Feb 2017, 15:28
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.143 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Ausführung von links nach rechts?

  Alt 10. Feb 2017, 16:10
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)...

Mavarik
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.016 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#6

AW: Ausführung von links nach rechts?

  Alt 10. Feb 2017, 17:09
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)
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#7

AW: Ausführung von links nach rechts?

  Alt 10. Feb 2017, 19:45
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 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.
Der Code war sowas wie if (Wert <> '') and Auswerten(Wert) then ... .
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (10. Feb 2017 um 20:05 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.159 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: Ausführung von links nach rechts?

  Alt 10. Feb 2017, 20:01
Wow, netter Fallstrick

Man könnte auch sagen: Wer mir Variants arbeitet hat all die Schmerzen verdient die daraus entstehen
  Mit Zitat antworten Zitat
Benutzerbild von Valle
Valle

Registriert seit: 26. Dez 2005
Ort: Karlsruhe
1.223 Beiträge
 
#9

AW: Ausführung von links nach rechts?

  Alt 11. Feb 2017, 14:26
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 )

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.
Valentin Voigt
BOFH excuse #423: „It's not RFC-822 compliant.“
Mein total langweiliger Blog
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:42 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