if 分岐
(1) はじめにコンピュータを使うと,とても速く計算できますが,もし「分岐」がなければ1つのプログラムは1つのことしかできないことになります. |
(2) 同値演算子と比較演算子 このページでは,if分岐を使ったプログラミングを学ぶために,サブテーマとして同値演算子と比較演算子も学びます.
サブテーマ) 同値演算子 ==
数学とは異なり,1つの等号( = )は右辺の値を左辺の変数に代入する「代入演算子」として使われ,等しいかどうか調べることには使いません. 等しいかどうか調べるには,右辺の値と左辺の値を比較して,等しければ真,等しくなければ偽となる「同値演算子」(2つの等号を並べた == )を使います. 等しくないかどうかを調べるには != を使います. |
(3) if分岐の基本 {処理1; 処理2; … } この if文 を書く上で注意点が2つあります.
@ 実行する処理をブロック{ }で囲むこと
A if(条件)の行末にセミコロン( ; )を付けないこと 処理1; 処理2; … 右の3.2の書き方は,if(条件)を単文の処理1のみに働かせる書き方で,条件を満たしているかどうかに関わらず処理2は無条件に(*)実行されます. {処理1; 処理2; … }
if(条件)
if(条件);と書くと,if(条件)が満たされるかどうかに関わらず処理1, 処理2とも無条件に(*)実行されます.; {処理1; 処理2; … } |
処理1; 処理2; … } {if(条件2) {処理A; … } } この教材の管理人はK&Rスタイルを採用せず,ブロック{ }の初めと終わりを縦に並べる右の3.5のスタイルにしています. if(条件1) return; if(条件2) return; 処理2; 右の3.6が関数の中にある場合,条件1, 2のどちらも満たさない場合だけ処理2に進みます. |
【例3.1】
xx1 = 5; yy1 = 0; zz1 = 0; if(xx1 == 5) {yy1 = 6; zz1 = 7; } document.write(yy1); document.write(zz1);
⇒ 67 と表示される(document.write(yy1);に改行タグを書いてないので,6の続きに7が表示される)
【例3.2】
xx1 = 5; yy1 = 0; zz1 = 0; if(xx1 != 5) yy1 = 6; zz1 = 7; document.write(yy1); document.write(zz1);
⇒ 07 と表示される(xx1 != 5の条件を満たさないから,yy1は0のまま,zz1には無条件に7が代入される)
【例3.3】
xx1 = 5; yy1 = 0; zz1 = 0; if(xx1 == 4); {yy1 = 6; zz1 = 7; } document.write(yy1); document.write(zz1);
⇒ 67 と表示される(xx1 == 4の条件を満たすとき空文( ; )を実行し,5のように満たさないとき何もしないから,if(条件)が済んでもyy1, zz1は0のまま.しかし,次のブロック{ }で無条件にyy1 = 6, xx1 = 7が実行される)
|
【例3.4】
xx1 = 5; yy1 = 0; zz1 = 0; if(xx1 == 4){ yy1 = 6; zz1 = 7; } document.write(yy1); document.write(zz1);
⇒ 00 と表示される(xx1 == 4の条件を満たさないから何も行われず,if(条件)が済んでもyy1, zz1は0のままになる)
【例3.5】
xx1 = 5; yy1 = 6; zz1 = 7; if(xx1 == 5) {if(yy1 == 6) {zz1 = 8; } } document.write(zz1);
⇒ 8 と表示される(xx1 == 5の条件もyy1 == 6も満たされるから,zz1は8になる)
|
(4) if 〜 else -- {ブロック1; } else {ブロック2; } if(条件)の行末にセミコロンを書いてはいいけないこと,ブロック{ }を省略すると単文にだけ働くことなどは,(3)と同様です. さらに深く分岐する必要がある場合,論理的には右図のような樹形図に分けていくべきだとも思えますが,この形にしていくと分岐が深くなっていったときに,前提となる条件の成否が見た目だけでは分かりにくくなります. {ブロック1; } else if(条件2) {ブロック2; } else {ブロック3; } 右の4.2では,条件1を満たすときにブロック1を実行し,条件1を満たさないもののうち条件2を満たすときに条件2を実行する.いずれにも該当しなかったものは全すべてブロック3を実行します. BASIC系のプログラミング言語などでは,elseifという1つのキーワードを使うものもありますが,javascriptでは else ifです.また,if 〜 then ...とも書きません. |
{ブロック1; } else if(条件2) {ブロック2; } else if(条件3) {ブロック3; } else if(条件4) {ブロック4; } else {ブロック5; } 例えば,xx1とyy1の値の組合せに応じて,次の表のように1等から4等まで表示する場合 xx1 = 3; yy1 = 3; if(xx1 == 1) document.write('1等'); else if(yy1 == 1) document.write('2等'); else if(xx1 == 2) document.write('3等'); else if(xx1 == 3) document.write('4等');と書けばよいでしょう.なお,1等のような文字列は引用符で囲みます. ※最後の分岐をelse if(xx1 == 3)でなく単にelseとした場合は,xx1やyy1が1よりも小さい場合や3よりも大きい場合もすべて4等になります.上のプログラムでは,そのような場合は何も表示されません.--このように,その他全部としてのelseを付けないこともできます. |
(間違いやすい1) if(xx1 = 1) 等しいかどうか調べるには,比較演算子 == を使わなければなりません.数学の方程式を書いている感覚で = を使うと,条件が常に成立することになり,意図したことと異なる結果になります. xx1 = 1; yy1 = 0; if(xx1 = 2) yy1 = 10; else yy1 = 20; document.write(yy1); |
(間違いやすい2) if 〜 if -- if分岐は,「もし〜ならば,…」「もし--ならば,...」というような日本語での分類に対応していると錯角しがちですが
if(条件1)
のように書くと,「どちらか一方だけが実行される」のではなく「両方とも実行される場合がある」ことに注意しましょう.
処理1;
if(条件2)処理2;
xx1 = 1; yy1 = 2; if(xx1 == 1) document.write('1等'); if(yy1 == 2) document.write('2等'); 右のようにプログラムを書くと,1等も2等も表示されます.すなわち,初めの if(xx1 == 1)の分岐が終っても,まだ次のif(yy1 == 2)の分岐に突入します. もし1等になればもう2等にはならないという意図なら, else if(yy1 == 2)と書かなければなりません. |
(5) サブテーマ:比較のしかた (5.1) if(x == y) ≪再掲≫ xとyの値が等しければ真(条件成立)となり,等しくなければ偽(条件不成立)となります. {ブロック1; } else {ブロック2; } xx1 = 0; yy1 = 1; if(xx1 == 2) {yy1 = 3; } else {yy1 = 4; } document.write(yy1);
⇒ このプログラムでは,
xx1 == 2が成り立たないから,yy1の値が4になり,4が表示されます. |
(5.2) if(x != y) ≪再掲≫ xとyの値が等しくなければ真(条件成立)となり,等しければ偽(条件不成立)となります. {ブロック1; } else {ブロック2; } xx1 = 0; yy1 = 1; if(xx1 != 2) {yy1 = 3; } else {yy1 = 4; } document.write(yy1);
⇒ このプログラムでは,
※Excelなどで等しくないことを表すx <> y は,javascriptでは使われません.
xx1 != 2が成り立つから,yy1の値が3になり,3が表示されます. |
(5.3) if(x < y) xの値がyの値がよりも小さければ真(条件成立)となり,そうでなければ偽(条件不成立)となります. xがyよりも大きい場合だけでなく,xとyが等しい場合も偽となります. {ブロック1; } else {ブロック2; } xx1 = 0; yy1 = 1; if(xx1 < 0) {yy1 = 3; } else {yy1 = 4; } document.write(yy1);
⇒ このプログラムでは,
xx1 < 0が成り立たないから,yy1の値が4になり,4が表示されます. |
(5.4) if(x <= y) xの値がyの値以下ならば真(条件成立)となり,大きければ偽(条件不成立)となります. {ブロック1; } else {ブロック2; } xx1 = 5; yy1 = 6; if(xx1 <= 10) {yy1 = 3; } else {yy1 = 4; } document.write(yy1);
⇒ このプログラムでは,
※2つの記号を組み合わせたもの <= の間に空白を入れるとエラーになります.必ず詰めて書いてください.xx1 <= 10が成り立つから,yy1の値が3になり,3が表示されます. 中高の数学に時間に≦のことを,「イコール小なり」と読んでいても「小なりイコール」と呼んでいても,それはどちらでも構いませんが,プログラミングでは <=の順でなければならず,=<の順に書くとエラーになります. |
(5.5) if(x > y) xの値がyの値がよりも大きければ真(条件成立)となり,そうでなければ偽(条件不成立)となります. xがyより小さい場合だけでなく,xとyが等しい場合も偽となります. {ブロック1; } else {ブロック2; } xx1 = 3; yy1 = 1; if(xx1 > 4) {yy1 = 40; } else if(xx1 > 2) {yy1 = 20; } else yy1 = 10; document.write(yy1);
⇒ このプログラムでは,
※if(xx1 > 4), else if(xx1 > 2)のように重複する範囲を分類に使う場合,if(xx1 > 2)のような広い方の範囲を先に指定するとelse if(xx1 > 4)の記述は何も役に立たないことに注意.狭い方から絞っていけばelse ifが働きます.
xx1 > 4が成り立たず,xx1 > 2が成り立つから,yy1の値が20になり,20が表示されます. |
(5.6) if(x >= y) xの値がyの値以上ならば真(条件成立)となり,小さければ偽(条件不成立)となります. {ブロック1; } else {ブロック2; } xx1 = 0; yy1 = 1; if(xx1 >= 4) {yy1 = 40; } else if(xx1 >= 2) {yy1 = 20; } else yy1 = 10; document.write(yy1);
⇒ このプログラムでは,
※<= のときと同様に,>と=の間に空白を入れるとエラーになります.必ず詰めて書いてください.xx1 >= 4が成り立たず,xx1 >= 2も成り立たないから,yy1の値が10になり,10が表示されます. また,>=の順のみ使えて,=>の順には使えません. |
(参考)
以下の内容を,中高生が覚えたり習得する必要はないが,このような表現に出会ったときに何が書いてあるのかが分かればよい.
専門家のプログラムには,if(xx)とかif(!xx)のように,等号も不等号も使われていない変数や関数そのものが条件文として書かれていることがあります.そもそも,if(条件式)は,条件式が成り立てば真(true)という値になり,成り立たないとき偽(false)という値をとる仕組みになっています.5.1〜5.6はこのように真偽を判断して真(true),偽(false)の値に応じて以後の処理を決めたものです. ところで,高校数学で習う真偽は真=true=1,偽=false=0のように決まっていますが,「javascriptのプログラム上では,偽=false=0,それ以外はすべて真=true」とするようになっています.
【高校数学の真偽の値】
【コンピュータで使う真偽の値】 ※否定演算子( ! )は後ろの項の真偽を反対にします.偽=false=0とすると,それ以外は真=true |
【参考.1】
xx1 = 2;(またはxx1=true;または xx1=-0.1;) if(xx1) {yy1 = 40; } else {yy1 = 10; } document.write(yy1);
⇒ 2(またはtrueまたは-0.1)は真だから40と表示される
【参考.2】
xx1 = 2;(または xx1=false;またはxx1=-0.1;) if(!xx1) {yy1 = 40; } else {yy1 = 10; } document.write(yy1);
⇒ 2(または-0.1)は真だから!xx1は偽となり10と表示される.falseは偽だから!falseは真となり40と表示される.
|
【チェックテスト】 次のプログラムが<script type="text/javascript">〜</script>の中に書かれているとき,画面に表示されるものを答えてください.
(1)
aa1 = 1; bb1 = 2; cc1 = 3; if(aa1 == 1) bb1 = 4; cc1 = 5; document.write(bb1); document.write(cc1); |
(2)
aa1 = 1; bb1 = 2; cc1 = 3; if(aa1 > 0) {bb1 = 4; } else {cc1 = 5; } document.write(bb1); document.write(cc1); |
(3)
aa1 = 3; bb1 = 4; cc1 = 5; if(aa1 == bb1) {cc1 = 0; } else if(aa1 > bb1) {cc1 = aa1; } else {cc1 = bb1; } document.write(cc1); |
(4)
aa1 = 3; bb1 = 4; cc1 = 5; if(aa1 = bb1) {cc1 = 6; } else {cc1 = bb1; } document.write(cc1); |