2010年02月23日(火)
if文の注意点(1) [プログラミング]
売買ルールのプログラムでは、必ずと言っていいほど条件分岐が出てきます。
条件分岐の基本はif文です。
あるテクニカル指標の値が10より小さいとか、90より大きいとか、一つの条件であればそう難しくありませんが、複数の条件の組合せになると、思った通りに動かないこともあります。
例えば、あるテクニカル指標(ここでは x とします)が10から90の間だと条件成立(true)という場合を見てみます。
この場合、「xが10より大きいという条件(x>10)」と「xが90より小さいという条件(x<90)」を同時に満たさなくてはいけないので、これらの条件を論理積(AND)演算子の「&&」で結んでひとつの条件とします。
int start()
{
double x = 50;
if(x > 10 && x < 90) Print("true");
else Print("false");
return(0);
}
この条件は数式で書くと「10 < x < 90」となるので、「x > 10」の代わりに「10 < x」と書いても構いません。
if(10 < x && x < 90) Print("true");ここで初心者がよく間違えるのは、「10 < x < 90」をそのまま
if(10 < x < 90) Print("true");と書いてしまうことです。
これでは、想定した通りの条件分岐はされず、x が何であっても条件を満たしてしまい、常にtrueと表示されます。
しかも、困ったことにコンパイルでエラーメッセージが出ないのです。
どういうことかと言うと、上の条件式は、実際には
if((10 < x) < 90) Print("true");のように最初に「10 < x」という条件が評価されます。
ここで、xが10より大きければ「10 < x」はtrue(数値としては1)となり、次は
if(1 < 90) Print("true");という条件式の評価になります。
また、xが10以下であれば「10 < x」はfalse(数値としては0)となるので、次の条件式は
if(0 < 90) Print("true");となります。
このように xの値に関係なく、常に成り立つ条件に置き換わってしまうので、全く条件分岐になっていないのです。
コンパイラには人の気持ちはわかりません。コンパイラにとっては、別に文法が間違っていないので、エラーを出す気持ちにはなれないわけです。
プログラミングをマスターするということは、コンパイラの気持ちがわかるようになる、ということかもしれません。
Tweet
Posted at 13時46分






