【その他の演算子】

インデックス作成 ( [] )について

下の例の場合、配列『i』 番目の要素にアドレス指定されたため、式の値は『i』番目の通し番号の変数の値になり、『3』が代入されます。

例:

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

整数のみが配列のインデックス(通し番号)になれます。4 次元以下の配列が使用可能。

例として、50 の要素からなる1次元配列は、最初の要素は array[0] 、最後の要素は array[49] と表現されます(最初のインデックスはが0からカウントされる)

x1, x2 ,..., xn 引数での関数の呼び出しについて

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

式の値とは、関数によって返される値です。(void型の場合、関数呼び出しは代入演算子の右側に配置不可)

例:

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

 

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

 

〈カテゴリ〉

・演算と式