Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 202

 
Kommentare, die sich nicht auf dieses Thema beziehen, wurden nach "Fragen von MQL5 MT5 MetaTrader 5 Anfängern" verschoben.
 

Die Standardfunktionen erhalten die Argumente von links nach rechts.

Benutzerdefinierte Funktionen erhalten die Argumente von rechts nach links.

double f1()
{
  Print(__FUNCSIG__);
  
  return(0);
}

double f2()
{
  Print(__FUNCSIG__);
  
  return(0);
}

void Func( double, double )
{
}

#define  PRINT(A) Print(#A);  A

void OnStart()
{  
  PRINT(MathMin(f1(), f2()));
  
  PRINT(Func(f1(), f2()));
}


Ergebnis.

        MathMin(f1(),f2())
        double f1()
        double f2()
        Func(f1(),f2())
        double f2()
        double f1()


Ist das der richtige Weg?

 
fxsaber:

Ist das so gewollt?

Auf diese UB ist kein Verlass. D.h. man muss ausdrücklich Situationen vermeiden, in denen die Logik eines Programms von der Reihenfolge abhängt, in der die Argumente ausgewertet werden

 
fxsaber:

Reguläre Funktionen erhalten Argumente von links nach rechts.

Hier ein widerlegendes Beispiel:

string f1() { Print(1); return NULL; }
string f2() { Print(2); return NULL; }
void OnStart()
{
    StringCompare(f1(), f2());
}

Ergebnis: 2 1

 
Andrei Trukhanovich:

Auf diese UB ist kein Verlass. D.h. wir müssen ausdrücklich Situationen vermeiden, in denen die Logik eines Programms von der Reihenfolge abhängt, in der die Argumente ausgewertet werden

A100:

Hier ein widerlegendes Beispiel:

Es stellt sich heraus, dass alles mit benutzerdefinierten instabil ist. Bei benutzerdefinierten Lösungen ist alles von Anfang an instabil.

 
fxsaber:

Es stellt sich heraus, dass mit den Standardgeräten alles instabil ist. Bei den benutzerdefinierten ist es von Anfang an eindeutig.

Der Unterschied besteht darin, dass es reguläre Funktionen (von rechts nach links) und Inline-Funktionen (undefinierte Reihenfolge) gibt.

Inline-Funktionen sind gar keine Funktionen, d.h. sie können keine Adresse haben. Aus dieser Sicht gibt es keinen Unterschied zwischen regulären und benutzerdefinierten Funktionen. So ist es beispielsweise unklar, warum die Argumente der einfachsten benutzerdefinierten Funktion (die im Grunde genommen inline ist) immer von rechts nach links berechnet werden. Ich schließe nicht aus, dass sich in Zukunft bei Inline-Funktionen die Reihenfolge ändern kann, also

Ich habe schon einmal vorgeschlagen, ein Inline-Schlüsselwort für die sichere Verwendung der Reihenfolge der Berechnungen einzuführen:

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Fehler, Irrtümer, Fragen

A100, 2017.10.05 14:30

Dies zeigt einmal mehr die Nützlichkeit des C++-Schlüsselworts "inline" (es gab hier die Meinung, dass es angeblich veraltet sei).
Inline bedeutet unter anderem, dass der Programmierer die Berechnungsreihenfolge der Funktionsparameter nicht verwendet, und wenn der Compiler beschließt, die Inline-Funktion inline zu machen, dann kann der Compiler die Vorwärtsberechnungsreihenfolge als effizienter verwenden (die Rückwärtsberechnungsreihenfolge ist offensichtlich nur für aufgerufene Funktionen effizient).
Gleichzeitig sollte der Compiler, wenn er beschließt, eine Nicht-Inline-Funktion einzubetten, die (allgemeine) umgekehrte Reihenfolge der Auswertung verwenden, auch wenn dies zu einem Effizienzverlust führt (weil der Programmierer diese Reihenfolge angenommen hat, ohne die Funktion als Inline-Funktion deklariert zu haben)

inline wäre auch in MQL angebracht, wo die Berechnungsreihenfolge nicht explizit kontrolliert werden kann


 
A100:

Der Unterschied besteht darin, dass es normale Funktionen (von rechts nach links) und Inline-Funktionen (undefinierte Reihenfolge) gibt.

Inline-Funktionen sind gar keine Funktionen, d.h. sie können keine Adresse haben. Aus dieser Sicht gibt es keinen Unterschied zwischen regulären und benutzerdefinierten Funktionen. So ist zum Beispiel unklar, warum die Argumente der einfachsten benutzerdefinierten Funktion (die im Grunde genommen inline ist) immer von rechts nach links berechnet werden. Ich schließe nicht aus, dass sich in Zukunft bei Inline-Funktionen die Reihenfolge ändern kann, also

Ich habe schon einmal vorgeschlagen, ein Inline-Schlüsselwort für die sichere Verwendung der Berechnungsreihenfolge einzuführen:

Danke für die Klarstellung, ich hatte nicht an Inline gedacht.

__forceinline void Func( double, double )

Eine solche Option hat keinen Einfluss auf das Ergebnis.

 
fxsaber:

Danke für die Klarstellung, ich hatte nicht an das Inline-Verfahren gedacht.

Diese Option hat keinen Einfluss auf das Ergebnis.

Es hat keinen Effekt jetzt, weil es irgendwie nicht in MQL existiert

#define inline

und in Zukunft könnte es eine echte Bedeutung haben, warum sollte es sonst eingeführt werden?

 
A100:

Es hat keine Auswirkungen, weil in MQL ist es irgendwie abwesend jetzt

und in Zukunft könnte es eine echte Bedeutung haben, warum wäre es sonst eingeführt worden?

Soweit ich mich aus der Hilfe zu dieser Version erinnere, wurde sie als Stub eingeführt, um das Inlinen von *.h-Dateien zu ermöglichen.

 
Was die Reihenfolge des Aufrufs von Funktionen betrifft, deren Rückgaben als Argumente an eine Funktion übergeben werden, so stellt der C++-Standard keine Anforderungen an den Compiler bezüglich der Reihenfolge ihrer Berechnung, sie können in beliebiger Reihenfolge aufgerufen werden(https://en.cppreference.com/w/cpp/language/eval_order). Wie die Analogie auf mql anwendbar ist, bleibt den Entwicklern überlassen, die sich vielleicht die Mühe gemacht haben, sie zu definieren.
Grund der Beschwerde: