2010年5月1日土曜日

★MQL4の落とし穴 ‐ 演算子の優先順位
MQL4 Trap: Precedence Rules


MQL4(MetaQuotes Language 4)にはC/C++に馴れてるとついつい嵌っててしまう落とし穴がいくつか存在する。
そのうちのもっとも大きなものと思われるのが演算子(オペレーター)の優先順位。
なかでもちょっと衝撃的だったのが論理積(「&&」)と論理和(「||」)の順番で、 当然論理積の方が高いつもりでコーディングしていたらどうも動きが変。 調べてみると、以下のコードで、
bool a = false, b = false, c = true;
bool r0 = (a && b || c);
bool r1 = (a && b) || c;
bool r2 = a && (b || c);
Print("r0/1/2= ", r0, ", ", r1, ", ", r2);
これを実行すると、「1, 1, 0」が期待されるところ、「0, 1, 0」と表示される。
これってMQL4のバグ? と思いつつリファレンスのPrecedence rulesを参照してみると...
なんと「||」の方が「&&」より上にきている!
ついでにビット演算の方は「|」と「&」(とさらに「^」)が同じ優先順位とか。なんだこれ...
  • 教訓: 式には括弧をつけましょう。
この記事を書くにあたって、MQL5の方はどーなってんだろうなと思って見てみたら...
MQL5→ReferenceLanguage→BasicsOperations and Expressions→Precedence Rules
Attention: Precedence of operations in the MQL5 language
           corresponds to the priority adopted in C++,
           and differs from the priority given in the
           MQL4 language.
ということで、C++と同じにしましたとさ。それはそれでMQL4からの移植に困るだろうにと思いつつ。

1 件のコメント: