Caratteristiche del linguaggio mql5, sottigliezze e tecniche - pagina 202

 
I commenti non relativi a questo argomento sono stati spostati in "Domande dai principianti di MQL5 MT5 MetaTrader 5".
 

Le funzioni standard ricevono gli argomenti da sinistra a destra.

Le funzioni personalizzate ricevono gli argomenti da destra a sinistra.

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()));
}


Risultato.

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


È così che dovrebbe essere?

 
fxsaber:

È così che deve essere?

Questo è un UB su cui non si può fare affidamento. Cioè si devono evitare esplicitamente situazioni in cui la logica di un programma dipende dall'ordine in cui gli argomenti sono valutati

 
fxsaber:

Le funzioni regolari ricevono argomenti da sinistra a destra.

Ecco un esempio confutante:

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

Risultato: 2 1

 
Andrei Trukhanovich:

Questo è un UB su cui non si può fare affidamento. Cioè dobbiamo evitare esplicitamente situazioni in cui la logica di un programma dipende dall'ordine di valutazione degli argomenti

A100:

Ecco un esempio di confutazione:

Si scopre che tutto è instabile con quelli personalizzati. Con quelli personalizzati, tutto è instabile dall'inizio.

 
fxsaber:

Si scopre che tutto è instabile con quelli standard. Con quelli personalizzati, è inequivocabile fin dall'inizio.

La differenza è che ci sono funzioni regolari (da destra a sinistra) e funzioni in linea (ordine indefinito).

le funzioni inline non sono affatto funzioni, cioè non possono avere un indirizzo. Da questo punto di vista, non c'è differenza tra le funzioni regolari e quelle personalizzate, quindi, per esempio, non è chiaro perché gli argomenti della funzione personalizzata più semplice (che è in sostanza inline) sono sempre calcolati da destra a sinistra. Non escludo che in futuro per le funzioni in linea l'ordine possa cambiare, quindi

Ho suggerito una volta di introdurre una parola chiave inline per un uso sicuro dell'ordine dei calcoli:

Forum sul trading, sistemi di trading automatico e test di strategie di trading

Errori, bug, domande

A100, 2017.10.05 14:30

Questo dimostra ancora una volta l'utilità della parola chiave C++ inline (c'era un'opinione qui che era presumibilmente obsoleta).
Tra le altre cose, inline significa effettivamente che il programmatore non usa l'ordine di calcolo dei parametri della funzione e se il compilatore decide di rendere la funzione inline, allora il compilatore può usare l'ordine di calcolo in avanti come più efficiente (l'ordine di calcolo inverso è ovviamente efficiente solo per funzioni chiamate).
Allo stesso tempo, se il compilatore decide di incorporare una funzione non inline, dovrebbe usare l'ordine (generale) inverso di valutazione, anche se questo porta a una perdita di efficienza (perché il programmatore ha assunto questo ordine senza aver dichiarato la funzione inline)

inline sarebbe anche appropriato in MQL, dove l'ordine di calcolo non può essere controllato esplicitamente


 
A100:

La differenza è che ci sono funzioni normali (da destra a sinistra) e funzioni in linea (ordine indefinito).

Le funzioni in linea non sono affatto funzioni, cioè non possono avere un indirizzo. Da questo punto di vista, non c'è differenza tra le funzioni regolari e quelle personalizzate, quindi, per esempio, non è chiaro perché gli argomenti della funzione personalizzata più semplice (che è in sostanza inline) sono sempre calcolati da destra a sinistra. Non escludo che in futuro per le funzioni in linea l'ordine possa cambiare, quindi

Ho suggerito una volta di introdurre la parola chiave inline per un uso sicuro dell'ordine di calcolo:

Grazie per il chiarimento, non avevo pensato all'inline.

__forceinline void Func( double, double )

Questa opzione non ha effetto sul risultato.

 
fxsaber:

Grazie per il chiarimento, non avevo pensato all'inline.

Questa opzione non influenza il risultato.

Non ha effetto ora, perché non esiste in MQL

#define inline

e in futuro potrebbe avere un significato reale, altrimenti perché sarebbe stato introdotto?

 
A100:

Non ha effetto ora, perché in MQL è un po' assente ora

e in futuro potrebbe avere un significato reale, altrimenti perché sarebbe stato introdotto?

Per quanto ricordo dall'aiuto alla versione, è stato introdotto come stub per permettere di inlineare i file *.h.

 
Per quanto riguarda l'ordine di chiamata delle funzioni i cui ritorni sono passati come argomenti a una funzione, lo standard c++ non impone requisiti al compilatore sull'ordine del loro calcolo, possono essere chiamate in qualsiasi sequenza(https://en.cppreference.com/w/cpp/language/eval_order). Come l'analogia sia applicabile a mql dipende dagli sviluppatori, che possono o non possono essersi preoccupati di definirla.
Motivazione: