その他の演算子

インデックス作成 ( [] )

配列の i 番目の要素にアドレス指定された場合、式の値は、i の通し番号を持つ変数の値になります。

例:

array[i] = 3; // 配列の i 番目の要素に 3 を割り当てる

整数のみが配列のインデックスになれます。4 次元以下の配列が使用可能です。それぞれの次元のインデックスは 0 から 次元のサイズ-1 です。例えば、50 の要素からなる1次元配列がある場合には、最初の要素は array[0] と参照され、最後の要素は array[49] となります。

配列の範囲以外のアドレスが指定された場合、実行サブシステムは重大エラーを発生し、プログラムが停止されます。

x1, x2 ,..., xn 引数での関数の呼び出し

各引数は、定数、変数、または対応する型式を表すことが出来ます。渡された引数をコンマで区切って指定し、呼び出された関数名の後ろの丸括弧の中に書く必要があります。

式の値とは、関数によって返される値です。もし、返される値の型が void の場合、関数呼び出しは、代入演算子の右側に配置出来ません。x1,..., xnの表現の実行順は保証されることにご注意ください。

例:

  int length=1000000;  
  string a="a",b="b",c;
//---その他の演算子
  int start=GetTickCount(),stop;
  long i;
  for(i=0;i<length;i++)
    {
     c=a+b;
    }
  stop=GetTickCount();
  Print("time for 'c = a + b' = ",(stop-start)," milliseconds, i = ",i);

コンマ演算子( , )

コンマで区切られた式は、左から右に実行されます。左式計算の副作用は右側の式を計算する前に現れることがあります。結果の型と値は右の式のものと一致します。受け渡されるパラメータのリスト(上記参照)は例として考えることが出来ます。

例:

for(i=0,j=99; i<100; i++,j--) Print(array[i][j]);

ドット演算子( . ) #

ドット演算子は構造体とクラスの public メンバへのアクセス を直接行うのに使用されます。構文:

構造体型の変数名 . メンバ名

例:

  struct SessionTime
    {
    string sessionName;
    int    startHour;
    int    startMinutes;
    int    endHour;
    int    endMinutes;
    } st;
  st.sessionName="Asian";
  st.startHour=0;
  st.startMinutes=0;
  st.endHour=9;
  st.endMinutes=0;

スコープ定義演算子 ( :: ) #

MQL5 プログラムの各関数には独自の実行スコープがあります。例えば、Print() システム関数はグローバルスコープで実行されます。Imported 関数は対応するインポートの範囲で呼び出されます。クラスのメソッド関数は対応するクラスのスコープを持ちます。スコープ解決演算の構文は次の通りです。

[スコープ名]::関数名(パラメータ)

スコープ名の不在は、グローバルスコープを使用する明示的な指示です。スコープ解決演算子がない場合、関数は最も近い範囲で求められます。ローカルスコープ内に関数がない場合、検索はグローバルスコープで行われます。

スコープ解決演算子はクラスメンバの 関数定義にも使用されます。

型 クラス名::関数名(パラメータ)
  {
// 関数の本体
  }

同名の関数をプログラム内の複数の実行コンテキストから使用すると、曖昧さを引き起こす可能性があります。明示的なスコープを指定せずに呼び出される時の関数の優先順位は次の通りです。

  1. クラスメソッド。指定された名称の関数がクラスに存在しない場合は、次のレベルに移動します。
  2. MQL5関数。MQL5 言語にそのような関数がない場合、次のレベルに移動します。
  3. ユーザ定義のグローバル関数。指定された名称の関数が見つからない場合は、次のレベルに移動します。
  4. インポートされた関数。指定された名称の関数が見つからない場合、コンパイラがエラーを返します。

関数呼び出しのあいまいさを避けるために、常に明示的なスコープ解決演算を使用して関数スコープを指定するべきです。

 

例:

#property script_show_inputs
#import "kernel32.dll"
  int GetLastError(void);
#import
 
class CCheckContext
 {
  int         m_id;
public:
              CCheckContext() { m_id=1234; }
protected:
  int         GetLastError() { return(m_id); }
 };
class CCheckContext2 : public CCheckContext
 {
  int         m_id2;
public:
              CCheckContext2() { m_id2=5678; }
  void       Print();
protected:
  int         GetLastError() { return(m_id2); }
 };
void CCheckContext2::Print()
 {
  ::Print("Terminal GetLastError",::GetLastError());
  ::Print("kernel32 GetLastError",kernel32::GetLastError());
  ::Print("parent GetLastError",CCheckContext::GetLastError());
  ::Print("our GetLastError",GetLastError());
 }  
//+------------------------------------------------------------------+
//| スクリプトプログラムを開始する関数                        |
//+------------------------------------------------------------------+
void OnStart()
 {
//---
  CCheckContext2 test;
  test.Print();
 }
//+------------------------------------------------------------------+

データ型のサイズまたは任意のデータ型オブジェクトのサイズ取得の操作( sizeof ) #

sizeof 演算子を使用すると、識別子または型に対応するメモリのサイズを定義することが出来ます。sizeof 演算の形式は次の通りです。

例:

sizeof(式)

括弧で囲まれた識別子または型名は式として使用することが出来ます。void 型の名称は使用出来ないことにご注意ください。また、識別子は、ビットフィールドに属したり関数名であることは出来ません。

式が静的配列(つまり、最初の次元が指定されている)の名称である場合、結果は配列全体のサイズ(要素数と型の長さの積)です。式が動的配列(つまり、最初の次元が指定されていない)の名称である場合、結果は 動的配列のオブジェクトサイズです。

sizeof が構造体またはクラス型や構造またはクラス型の識別子に適用された場合、結果は構造体またはクラスの実際のサイズです。

例:

  struct myStruct
    {
    char   h;
    int    b;
    double f;
    } str;
  Print("sizeof(str) = ",sizeof(str));
  Print("sizeof(myStruct) = ",sizeof(myStruct));  

サイズは、コンパイル段階で計算されます。

参照

優先順位のルール