【JavaScript 初心者講座】論理演算子の学習
本講座では、論理演算子を学習する。 「論理」というと難しく聞こえるが、論理的に考えれば比較的簡単ではある。 本講座の最終目標は「20未満の数字の中で、3と2の両方で割り切れる数字を探すプログラムを書く」という事である。 そうである。「6と12と18」である。暗算である。 しかしこの計算をプログラミングする。楽しみだ。
論理演算子 「AかつB」の「かつ」と 「AまたはB」の「または」が論理演算子
論理演算子は、「かつ」や「または」である。 これをプログラミングする。
&&演算子
論理演算子「かつ」のサンプルをみる。
002
003const a = 15 ;
004const b = 5;
005
006if ( a > 10 && b > 10 ) {
007
008 alert ( "OK" ) ;
009
010} else {
011
012 alert ( "NG" ) ;
013}
014</script>
プログラムを実行すると、「NG」と表示する。
プログラムを解説する。3行目と4行目で変数a、bを宣言して(読み取り専用変数を、今後「変数」と表記する)、 それぞれ「15」と「5」を代入する。 6行目でif文を実行する。 if文の条件式に、論理演算子「&&」を利用している。
AかつB A && B
「AかつB」をプログラムで書くと、「A && B」になる。
AかつB 「AとBがどちらもtrueである」という条件式
「AかつB」は「AとBがどちらも真である」という条件式である。 もし「A」と「B」のうち、どちらかが「真でない」場合、「AかつB」は「真でない」。 つまり、falseとなる。
004const b = 5;
005
006if ( a > 10 && b > 10 ) {
6行目を詳しく見る。aの値は15である。
004const b = 5;
005
006if ( 15 > 10 && b > 10 ) {
このようになる。つぎに、bの値を考える。bの値は5である。
004const b = 5;
005
006if ( 15 > 10 && 5 > 10 ) {
このようになる。つぎに、「15 > 10」を考える。 これは比較演算子を適用して、15が10よりも大きいか検証している。 その通りである。15は10よりも大きい。
004const b = 5;
005
006if ( true && 5 > 10 ) {
&&の左側が「true」になる。つぎに&&の右側を見る。 「5 > 10」である。 これは比較演算子を適用して、5が10よりも大きいか検証している。 無理である。5は10よりも小さい。
004const b = 5;
005
006if ( true && false ) {
このようになる。ここで「AかつB」を思い出してほしい。 「AかつB」は「A && B」である。
A | B | A && B | 結果 |
true | false | true && false | false |
AかつB 「AとBがどちらもtrueである」という条件式
&&は、両辺がどちらも「true」の場合に、「true」を戻す演算子である。 両辺の内どちらかが「false」の場合、「false」を戻す。
004const b = 5;
005
006if ( true && false ) {
if文で&&演算子を利用している。&&の右側がfalseなので、 &&演算子を適用した結果、「false」となる。
002
003const a = 15 ;
004const b = 5;
005
006if ( false ) {
007
008 alert ( "OK" ) ;
009
010} else {
011
012 alert ( "NG" ) ;
013}
014</script>
6行目のif文の条件式が「false」になる。つまり、ifブロックは実行されず、elseブロックが実行する。 このプログラムを実行すると、「NG」と表示する。
|| 演算子
「または」を意味する論理演算子を見る。
002
003const a = 15 ;
004const b = 5;
005
006if ( a > 10 || b > 10 ) {
007 alert ( "OK" ) ;
008} else {
009 alert ( "NG" ) ;
010}
011</script>
プログラムを実行すると、「OK」と表示する。
「または」演算子のプログラムである。では、解説する。 3行目と4行目で変数a、bを宣言して、 それぞれ「15」と「5」を代入する。 6行目でif文を実行する。 if文の条件式に、論理演算子「||」を利用する。
AまたはB A || B
「AまたはB」をプログラムで書くと、「A || B」になる。
AまたはB 「AとBのどちらかがtrueである」という条件式
「AまたはB」は「AとBのどちらかが真である」という条件式である。 もし、どちらかが「真」ならば、「AまたはB」は「真である」。 つまり、trueとなる。
004const b = 5;
005
006if ( a > 10 || b > 10 ) {
6行目のif文の条件式を見る。aとbの値は「10」と「5」である。
004const b = 5;
005
006if ( 15 > 10 || 5 > 10 ) {
このようになる。ここからの・・・、
004const b = 5;
005
006if ( true || false ) {
こうである。論理演算子「||」の両辺が「true」と「false」となる。
A | B | A || B | 結果 |
true | false | true || false | true |
AまたはB 「AとBのどちらかがtrueである」という条件式
「AまたはB」は「AとBのどちらかが真である」という条件式である。 どちらかが「真」ならば、「AまたはB」は「真である」。分かりやすい。
004const b = 5;
005
006if ( true || false ) {
このプログラムは、||演算子の両辺の内、左側が「true」なので、全体も「true」になる。
002
003const a = 15 ;
004const b = 5;
005
006if ( true ) {
007
008 alert ( "OK" ) ;
009
010} else {
011
012 alert ( "NG" ) ;
013}
014</script>
6行目のif文の条件式が「true」になる。つまり、ifブロックが実行する。 このプログラムを実行すると、「OK」と表示する。
&&演算子のまとめ
002
003//[true]
004alert ( true && true ) ;
005
006//[false]
007alert ( true && false ) ;
008
009//[false]
010alert ( false && true ) ;
011
012//[false]
013alert ( false && false ) ;
014
015</script>
プログラムを実行すると、「true」「false」「false」「false」と表示する。
&&の用法を全てまとめた。 &&の両辺のどちらかに「false」があれば、「false」となる。 両辺がtrueの場合のみ、trueを戻す。
A | B | A && B | 結果 |
true | true | true && true | true |
true | false | true && false | false |
false | true | false && true | false |
false | false | false && false | false |
||演算子のまとめ
002
003//[true]
004alert ( true || true ) ;
005
006//[true]
007alert ( true || false ) ;
008
009//[true]
010alert ( false || true ) ;
011
012//[false]
013alert ( false || false ) ;
014
015</script>
プログラムを実行すると、「true」「true」「true」「false」と表示する。
||の用法を全てまとめた。||の両辺のどちらかに「true」があれば、「true」となる。
A | B | A || B | 結果 |
true | true | true || true | true |
true | false | true || false | true |
false | true | false || true | true |
false | false | false || false | false |
公倍数を求める
20未満の数の中で、2と3の公倍数を求めるプログラムを記述する。 「2と3の公倍数」という事は、 「2と3で割り切れる数」という事である。 「割り切れる数」という事は、「剰余演算子」を利用すると良い。 20未満の値に対して、2と3の剰余が0の値を探す。
002//変数を二つ宣言
003const a = 2 ;
004const b = 3 ;
005
006//最大値
007const MAX = 20 ;
008
009for ( var i = 0 ; i < MAX ; i++ ) {
010
011 //両方の値で割り切れる場合、変数iを表示
012 if ( i % a == 0 && i % b == 0 ) {
013 alert ( i ) ;
014 }
015}
016</script>
プログラムを実行すると、「0」「6」「12」「18」と表示する。
a÷bの余り a % b ;
計算式「 a ÷ b 」の余りは
a % b
このプログラムである。「 % 」演算子を利用する。
aがbで割り切れる a % b == 0 ;
数値aが数値bで割り切れるという事は、 計算式「 a ÷ b 」の余りが「0」という事である。 余りを算出する場合、「 % 」演算子を利用する。
a % b == 0 ;
このプログラムが「true」になるという事である。 では、プログラムを解説する。
003const a = 2 ;
004const b = 3 ;
005
006//最大値
007const MAX = 20 ;
008
009for ( var i = 0 ; i < MAX ; i++ ) {
010
011 //両方の値で割り切れる場合、変数iを表示
012 if ( i % a == 0 && i % b == 0 ) {
013 alert ( i ) ;
014 }
015}
3行目と4行目で変数a、bを宣言して「2」と「3」を代入する。7行目で定数MAXを宣言して、 20を代入する。こんかい、20未満の数値で、2と3で割り切れる数を探す。 2と3で割り切れる整数は無限に存在する。そのため「20」未満の数、という制約を設ける。
9行目から16行目のforブロックで公倍数を探す処理をする。 まず、for文はMAX回繰り返す。
最初のfor文繰り返しを見る。 変数iの値は0である。
013 alert ( i ) ;
014}
「0」を何で割っても、剰余は「0」である。
013 alert ( i ) ;
014}
このようになる。進める。
013 alert ( i ) ;
014}
&&演算子の両辺が「true」なので、if文の条件式は「true」になる。
ifブロックが実行して、「0」と表示する。
では、forブロック二回目を見る。変数iの値は「1」である。
013 alert ( i ) ;
014}
「 1 % 2 は 1 」、「 1 % 3 は 1 」である。
013 alert ( i ) ;
014}
どちらも、falseである。if文は実行しない。
forブロック3回目を見る。変数iの値は「2」である。
013 alert ( i ) ;
014}
「 2 % 2 は 0 」、「 2 % 3 は 2 」である。
013 alert ( i ) ;
014}
013 alert ( i ) ;
014}
このプログラムは、 && の左側が「true」である。 しかし、&&の右側が「false」である。どちらかが「false」の場合、 &&演算子の結果は「false」である。if文は実行しない。
forブロック4回目を見る。変数iの値は「3」である。
013 alert ( i ) ;
014}
「 3 % 2 は 1 」、「 3 % 3 は 0 」である。
013 alert ( i ) ;
014}
013 alert ( i ) ;
014}
このプログラムは、 && の右側は「true」である。 しかし、&&の左側が「false」である。どちらかが「false」の場合、 &&演算子の結果は「false」である。if文は実行しない。
さて、なんやかんやでいろいろ進んでいく。
i | i%2 | i%3 | i%2 == 0 | i%3 == 0 | 結果 |
0 | 0 % 2 [ 0 ] | 0 % 3 [ 0 ] | 0 == 0 [ true ] | 0 == 0 [ true ] | true |
1 | 1 % 2 [ 1 ] | 1 % 3 [ 1 ] | 1 == 0 [ false ] | 1 == 0 [ false ] | false |
2 | 2 % 2 [ 0 ] | 2 % 3 [ 2 ] | 0 == 0 [ true ] | 2 == 0 [ false ] | false |
3 | 3 % 2 [ 1 ] | 3 % 3 [ 0 ] | 1 == 0 [ false ] | 0 == 0 [ true ] | false |
4 | 4 % 2 [ 0 ] | 4 % 3 [ 1 ] | 0 == 0 [ true ] | 1 == 0 [ false ] | false |
5 | 5 % 2 [ 1 ] | 5 % 3 [ 2 ] | 1 == 0 [ false ] | 2 == 0 [ false ] | false |
6 | 6 % 2 [ 0 ] | 6 % 3 [ 0 ] | 0 == 0 [ true ] | 0 == 0 [ true ] | true |
7 | 7 % 2 [ 1 ] | 7 % 3 [ 1 ] | 1 == 0 [ false ] | 1 == 0 [ false ] | false |
8 | 8 % 2 [ 0 ] | 8 % 3 [ 2 ] | 0 == 0 [ true ] | 2 == 0 [ false ] | false |
9 | 9 % 2 [ 1 ] | 9 % 3 [ 0 ] | 1 == 0 [ false ] | 0 == 0 [ true ] | false |
10 | 10 % 2 [ 0 ] | 10 % 3 [ 1 ] | 0 == 0 [ true ] | 1 == 0 [ false ] | false |
11 | 11 % 2 [ 1 ] | 11 % 3 [ 2 ] | 1 == 0 [ false ] | 2 == 0 [ false ] | false |
12 | 12 % 2 [ 0 ] | 12 % 3 [ 0 ] | 0 == 0 [ true ] | 0 == 0 [ true ] | true |
13 | 13 % 2 [ 1 ] | 13 % 3 [ 1 ] | 1 == 0 [ false ] | 1 == 0 [ false ] | false |
14 | 14 % 2 [ 0 ] | 14 % 3 [ 2 ] | 0 == 0 [ true ] | 2 == 0 [ false ] | false |
15 | 15 % 2 [ 1 ] | 15 % 3 [ 0 ] | 1 == 0 [ false ] | 0 == 0 [ true ] | false |
16 | 16 % 2 [ 0 ] | 16 % 3 [ 1 ] | 0 == 0 [ true ] | 1 == 0 [ false ] | false |
17 | 17 % 2 [ 1 ] | 17 % 3 [ 2 ] | 1 == 0 [ false ] | 2 == 0 [ false ] | false |
18 | 18 % 2 [ 0 ] | 18 % 3 [ 0 ] | 0 == 0 [ true ] | 0 == 0 [ true ] | true |
19 | 19 % 2 [ 1 ] | 19 % 3 [ 1 ] | 1 == 0 [ false ] | 1 == 0 [ false ] | false |
変数iは0から19まで増加する。そして、変数の値が 「0」「6」「12」「18」の時に、if文の条件がtrueになる。 解説は以上である。
まとめ
A | B | A && B | 結果 |
true | true | true && true | true |
true | false | true && false | false |
false | true | false && true | false |
false | false | false && false | false |
A | B | A || B | 結果 |
true | true | true || true | true |
true | false | true || false | true |
false | true | false || true | true |
false | false | false || false | false |