りな塾 #11 &&、||の優先順位
今回は、もうすこし深堀りして、if文の評価順番について見てきます。
混在しているときは&&が優先
&&(AND)と||(OR)が混在しているときは&&(AND)が優先されます。混在させた条件をプログラミングするときには少し注意が必要です。
自動バインドなどと言ったりするのですが、&&が自動的に( )でバインド(くくられ)ます。
if( a == 1 && b == 1 || c == 1 && d == 1 )
内部的にはこう評価される
⬇
if( (a == 1 && b == 1 ) || ( c == 1 && d == 1 ) )
こうすると、ちょっと明確になるかもしれません。
暗黙的にこのように自動処理されてしまうため、プログラミングがわかりにくくなってしまうことがあります。そのため、ANDとORを複数条件混在させるときには、自分で明示的に優先したい条件をあえて()でくくるようにするのが望ましいと思います。
条件は左から
次に、同じ符号同士だった場合の優先順位を見ていきましょう。このようにAND条件が並んだ場合、左から順番に評価されていきます。
if( a == 1 && b == 1 && c == 1 && d == 1 )
コンピュータ的には、まずはじめに評価するのは a == 1 をみます。これが正しかったら、b == 1 を評価します、、、次に c == 1 ... といったように左から順番に評価されてくという点を覚えておきましょう。
確定したら残りは実行されない
もうひとつ重要なことがあります。それは、条件が確定したら「残りは評価されずスキップされる」ということ。
次の例だとAの時点でIFの全体の条件が確定しているので、B以降は評価されません。
ORでくくられている場合も左から評価されて、ひとつでも合致している項目が見つかった時点で、全体の評価は確定します。
すると同様に、それ以降の条件は評価せずにスキップされます。
なぜ、これがそんなに重要なことなのか。。。
こんな実験をしてみましょう。
if条件の中で、変数 a、b、c、dを比較するときに +1 するという処理をいれています。IF文の条件が実行されれば、a、b、c、d すべての変数が +1 されるはずです。
a = 0;
b = 0;
c = 0;
d = 0;
if( a++ == 100 && b++ == 100 && c++ == 100 && d++ == 100 ){
}
console.log(a);
console.log(b);
console.log(c);
console.log(d);
結果はどうなりましたか?
a → 1
b → 0
c → 0
d → 0
となるはずです。最初のa以外は、+1されていません。
つまり、a++ == 100 の時点でIFの結果が確定しているので、そのあとの条件は実行されなかったということです。
ちょっと今の時点で関数の話をするのは、時期尚早ですが、、、例えば、このように友達にメールを送るという関数(架空の関数です)があったとします。エラーが発生した場合にerrorという文字が返ってくるなど、実行結果をIFで判定するようなことをします。
if( sendMailToFriends() == 'error' ){
//エラー発生時行う処理
}
このとき複数の条件を指定してしまうと、条件によってそもそもメールを送るという関数自体が実行されないなど、意図しないバグを引き起こす可能性があります。
if( hour == 6 && sendMailToFriends() == 'error' )
今日のクイズ
実行ログには何が表示されるでしょう?
a++の挙動覚えてますか?
a = 0;
b = 0;
c = 0;
d = 0;
if( a++ == 1 && b++ == 1 && c++ == 1 && d++ == 1 ){
}
console.log(a);
console.log(b);
console.log(c);
console.log(d);
a = 0;
b = 0;
c = 0;
d = 0;
if( a++ == 10 || b++ == 10 || c++ == 10 || d++ == 10 ){
}
console.log(a);
console.log(b);
console.log(c);
console.log(d);
a = 0;
b = 0;
c = 0;
d = 0;
if( a++ == 10 && b++ == 10 && c++ == 10 || d++ == 10 ){
}
console.log(a);
console.log(b);
console.log(c);
console.log(d);
この記事が気に入ったらサポートをしてみませんか?