Ist die Reihenfolge, in der Parameter berechnet werden, bevor eine Prozedur aufgerufen wird, in Delphi definiert?In Delphi werden Parameter in der Reihenfolge ausgewertet, wenn sie in eine Methode übergeben werden?
IOW, wenn ich diesen hässlichen Code (etwas gefunden, wie dies in einer Legacy-Anwendung) ...
function A(var err: integer): integer;
begin
err := 42;
Result := 17;
end;
Test(A(err), err);
... Testen ist garantiert Parameter erhalten (17, 42) oder könnte es auch sei (17, undefiniert)?
Edit:
Obwohl Davids Beispiel unterschiedliches Ergebnis mit 32-Bit und 64-Bit-Compiler zurückgibt, das (zum Glück) hat keinen Einfluss auf mein Legacy-Code, weil Test (A (err), err) nur speichert eine Adresse von 'err' im Register und es ist egal, ob der Compiler dies vor dem Aufruf von A (err) oder nach.
Dieser Artikel von Interesse sein kann http://blog.barrkel.com/ 2008/04/c-evaluation-order-gotcha.html –
Ein weiterer Beitrag dazu: http://stackoverflow.com/questions/3054526/delphi-compiler-directive-to-evaluate-arguments-in-reverse –
@David, Mir war dieses C-Feature bewusst, und ich habe auf SO gelernt, dass Java und C# von links nach rechts ausgewertet werden, aber ich konnte mich nicht erinnern, wo Delphi dies dokumentiert hat (und wie wir erfahren haben, ist die Dokumentation falsch). – gabr