mql5言語の特徴、微妙なニュアンスとテクニック - ページ 202

 
このトピックに関係のないコメントは、「MQL5 MT5 MetaTrader5初心者からの質問」に移動しました。
 

標準関数は、左から右に引数を受け取ります。

カスタム関数は、右から左へ引数を受け取ります。

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


結果

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


これがあるべき姿なのか?

 
fxsaber:

そういうものなのでしょうか?

これは、あてにならないUBです。すなわち、プログラムの論理が引数の評価順序に依存するような事態は明示的に避けなければならない。

 
fxsaber:

通常の関数は、左から右へ引数を受け取ります。

ここで、反論の例を挙げます。

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

結果:2 1

 
Andrei Trukhanovich:

これは、あてにならないUBです。つまり、プログラムの論理が引数の評価順序に依存するような事態は明示的に避けなければならないのです

A100:

ここで、反論の例を挙げます。

カスタム品ではすべてが不安定になることが判明しました。カスタムメイドの場合、最初からすべてが不安定です。

 
fxsaber:

標準のものでは、すべてが不安定であることがわかりました。カスタムメイドのものであれば、最初から曖昧さはありません。

違いは、通常の関数(右から左へ)とインライン関数(順序は不定)があることです。

インライン関数は関数ではなく、アドレスを持つことができません。この観点からすると、通常の関数とカスタム関数の違いはなく、例えば、最も単純なカスタム関数(要するにインライン)の引数が常に右から左に計算される理由は不明である。将来的にインライン関数で順番が変わる可能性は否定できないので

一時期、計算の順番を安全に使うためのインラインキーワードを導入することを提案したことがあります。

トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム

エラー、バグ、質問

A100, 2017.10.05 14:30

これは、C++のinlineキーワードの有用性を改めて示すものです(ここでは、inlineキーワードは時代遅れという意見もあったようです)。
中でもインラインとは、実際にはプログラマが関数のパラメータの計算順序を使用しないことを意味し、コンパイラがインライン関数をインライン化することを決定した場合、コンパイラは順方向の計算順序をより効率的に使用できる(逆方向の計算順序は明らかに呼び出された関数にのみ効率的である)ことを意味します。
同時に、コンパイラがインラインでない関数を埋め込むことを決定した場合、たとえそれが効率の低下につながるとしても、(プログラマが関数のインライン化を宣言せずにこの順序を仮定したため)評価の(一般的な)逆の順序を使用する必要があります。

インラインは、計算順序を明示的に制御できないMQLでも適切です。


 
A100:

違いは、通常の関数(右から左へ)とインライン関数(順序は不定)があることです。

インライン関数は関数ではなく、アドレスを持つことができません。この観点からすると、通常の関数とカスタム関数の違いはなく、例えば、最も単純なカスタム関数(要するにインライン)の引数が常に右から左に計算される理由は不明である。将来的にインライン関数で順番が変わる可能性は否定できないので

私は一時期、計算順序を安全に使用するためのインラインキーワードの導入を提案したことがあります。

わかりやすい説明ありがとうございます!インラインは思いつきませんでした。

__forceinline void Func( double, double )

このようなオプションは結果に影響を与えません。

 
fxsaber:

わかりやすい説明ありがとうございます!インラインは考えても みなかったです。

このオプションは結果に影響を与えません。

MQLには存在しないようなものなので、今は何の効果もない。

#define inline

と、将来的に本当の意味を持つかもしれない。そうでなければ、なぜ導入したのか?

 
A100:

MQLでは、今はもう存在しないようなものなので、影響はない。

と、将来的には本当の意味を持つかもしれない。そうでなければ、なぜ導入されたのか?

バージョンアップのヘルプを見た限りでは、*.hファイルをインライン化するためのスタブとして導入されたものと記憶しています。

 
戻り値が関数の引数として渡される関数の呼び出し順序については,c++規格ではコンパイラに計算順序の要件を課していないため,どのような順序で呼び出してもよい(https://en.cppreference.com/w/cpp/language/eval_order).このアナロジーをmqlにどう適用するかは、開発者次第であり、わざわざ定義する必要もないだろう。
理由: