2010年03月02日(火)
if文の注意点(2) [プログラミング]
CやMQL4でif文を使う際の注意点をもう一つ。
if文で条件が複雑になる場合、基本的には単純な条件を組み合わせることになりますが、そのときに論理和(OR)と論理積(AND)の違いに注意しなくてはいけません。
OR は「または」という意味、ANDは「かつ」という意味に置き換えればわかりやすいでしょう。
例えば、xが10から90の間の場合、x>10かつx<90なので、
if(x > 10 && x < 90)
のように「&&」というANDの演算子で条件を結びました。
逆に10以下と90以上の場合に条件が成り立つ場合を考えてみましょう。
日本語だと「何々と何々の場合」というように「と」という助詞を使います。
これは英語に直訳すると「and」になるかもしれませんが、論理的には「AND」の意味ではなく、「OR」の意味となります。
なので、
if(x <= 10 && x >= 90)
ではダメで
if(x <= 10 || x >= 90)
と書かなくてはいけません。
こんどは、もうちょっと複雑にして、「10から20までと80から90までの場合」に条件が成立するケースをみてみましょう。
さっきと同じく「10から20まで」の条件と「80から90まで」の条件はOR「||」で結ばれるので次のように書けます。
if(x > 10 && x < 20 || x > 80 && x < 90)
あるいは「||」の前後を入れ替えて
if(x > 80 && x < 90 || x > 10 && x < 20)
と書いてもよさそうです。
Cプログラムの場合、どちらの式でも正しく条件分岐されます。しかし、MQL4では、上の式は正しく条件分岐されますが、下の式はどの場合も成立しません。
なぜでしょう?
これはCとMQL4の仕様の違いがあるからです。
例えば「3+4*5」という式では「4*5=20」を先に計算して「3+20=23」を後から計算します。これを「優先順位」というのですが、論理演算子の場合も優先順位があります。
但し、
Cの場合:&& → || の順
MQL4の場合:|| → && の順
と、逆になっているのです。
なので、Cの場合、
if((x > 80 && x < 90) || (x > 10 && x < 20))
のように && を先に評価するのに対して、MQL4では、
if(x > 80 && (x < 90 || x > 10) && x < 20)
のように || を先に評価するのです。
その結果、80より大きい条件と20より小さい条件を同時に満たすことはあり得ないので、どんな場合でも条件が成り立たないということになるのです。
これは、Cを知っている人からすると、結構な落とし穴です。
MQL4では、複雑な条件式を書く場合、先に評価させたい条件を括弧「()」で囲んでおく方が確実と言えるでしょう。
Tweet
Posted at 17時24分






