プログラミングをやっていると、必ずと言っていいほど行う処理というのがいくつかある。
例えば、前回解説した変数。これがないとほぼシステムを組めない。
…だが、これだけではない。
ある処理を行いたいとき、様々な状況に対応する必要があるだろう。
例えば、Amazonであれば…ログインしているかどうかで表示する情報が変わる。
このように、ある条件によって処理を変える必要が出てくる。
今回は、そんな条件分岐を解説しよう。
そのために必要な真偽値という考え方も説明していく。
ちょっと長丁場になると思うが、これもどんなプログラミングでも使う考え方。
是非、マスターしていただきたい。
今回の説明内容
今回は、上に書いた通り真偽値と、条件分岐を解説する。
両方かなり重要な考え方になるし、特に真偽値は見た目に直接表れることは少ない。
どんな考え方に基づいているか、身に付けて欲しい。
真偽値
真偽値とは
真偽値とは、一言で言ってしまうとYESかNOか、という2択だ。
ほとんどのプログラムでは、真:true
と、偽:false
で用いられる。
この二つはともにリテラルで、型の考え方だとboolean型、bool型などと呼ばれる。
そのほとんどが、条件分岐のために用いられる…が、そのままリテラルで書いてしまうと、常に一定の処理になってしまう。
つまり、別の値から、これを計算してあげる必要があるのだ。
そのために、比較演算子、論理演算子というものが用意されている。
比較演算子
比較演算子とは、同じ型の二つのデータの関係を調べ、その結果をtrue
、もしくはfalse
として返す演算のこと。
例えば、二つの数値a
, b
を比較して、a
の方が大きければtrue
、そうでなければ(a
がb
以下ならば)false
を返す、といったことができる。
基本的に比較する二つのデータの間に比較演算子を書き、それによる結果の真偽値で、その2データごと置き換わるイメージだ。
今回解説しているJava、C言語、JavaScriptでは、基本的な論理演算子の書き方は共通している。
以下に、表でまとめてしまおう。
表の見方として、1列目に比較演算子を書く。これで、a 比較演算子 b
と書くこととしよう。
で、2列目はtrue
になるための条件、3列目はfalse
になるための条件を入れる。
比較演算子 | true | false |
---|---|---|
== | aとbが等しい | aとbが異なる |
< | aがbより小さい | aがb以上 |
<= | aがb以下 | aがbより大きい |
>= | aがb以上 | aがbより小さい |
> | aがbより大きい | aがb以下 |
!= | aとbが異なる | aとbが等しい |
例えば、a == b
と書いたら、aとbが等しい場合はtrue
、異なる場合はfalse
になる、といった具合だ。
比較演算子の使用例
具体的な例を見ていこう。二つの数字を比較してみる。
例えば、5 == 5
と書くと、両方は等しいのでtrue
に置き換わる。
これを、5 != 5
とすると、今度はfalse
だ。
このようにリテラルを書いてもいいのだが、もちろん変数でも問題ない。
num1 <= num2
と書けば、num1
に入っている数字が、num2
以下(等しい場合を含む)の時にtrue
、逆にnum1
がnum2
より大きければ(等しい場合は除く)false
となる。
さて、ここで一つ注意を。比較する内容が文字列の場合だ。
これは言語によって異なるのだが、文字列を比較する場合は、この比較演算子は使えない場合がある。
例えばJavaの場合。文字列が等しいかどうかを確認するための処理が用意されている。
文字列1.equals(文字列2)
こうすることで、文字列が同じかどうかを比較することができるようになる。
同じ場合はtrue
、異なる場合はfalse
だ。
C言語の場合は…ちょっと、あとに回させてほしい。ポインタの考えが出てきてしまう。
JavaScriptは、イコール二つで比較ができてしまう。ただ、補足する内容がある。
JavaScriptの文字列比較について
実は、JavaScriptの比較演算子は、異なる型でも比較することができる。
が、型まで調べるために、JavaScriptだけ更に二つの比較演算子が用意されている。
比較演算子 | true | false |
---|---|---|
=== | 2つのデータの型、値がともに等しい時 | trueにならない時 |
!== | 2つのデータの型、あるいは値が等しくない時 | trueにならない時 |
要するに、型まで含めて一致するかどうかを比較できるのだ。
今は「ふーん」でも構わない。このあたりも、詳細はポインタの部分で一緒に解説する文字列で話そう。
論理演算子
上では、二つの値の比較と書いた。
さて、この条件一つだけであればいいが、複数の条件を見たい場合も当然ある。
そこで、真偽値2つに関しては、別で論理演算子というものも用意されている。
これは、二つの真偽値の組み合わせで、更に真偽値を返すもの。
これも、書き方は3言語とも共通。
よく使うものは3つあるので、それぞれ表にまとめてしまおう。
まずは、AND(&&
)から。これは、両方true
なら結果もtrue
、どちらか一方でもfalse
ならfalse
になる。
a && b | a : true | a : false |
---|---|---|
b : true | true | false |
b : false | false | false |
次に、OR(||
)。これは、どちらか一方でもtrue
なら結果はtrue
、両方ともfalse
の時のみfalse
だ。
ちなみに、|
はバーティカルバーと呼ぶ。
a || b | a : true | a : false |
---|---|---|
b : true | true | true |
b : false | true | false |
最後に、NOT(!
)。これだけは一つの真偽値に対する論理演算子で、つけたもののtrue
とfalse
をひっくり返す。
ちなみに、!
はよくビックリマークと呼んでいるが、正式名称はエクスクラメーションマークと呼ぶらしい。
論理演算子の使用例
単純に二つの真偽値を挟む、あるいはNOTなら真偽値の前にくっつけるだけなのだが、具体的なものもちょっと見てみよう。
例えば、三つの数字num1
, num2
, num3
があるとしよう。これで、num1
が一番大きい場合にtrue
を返させたい。
その時、まずnum1
とnum2
、num1
とnum3
を比較し、両方ともnum1
の方が大きければいいわけだ。
というわけで、先に二つを比較してしまおう。num1 > num2
、num1 > num3
となる。
で、この両方がtrue
なら全体もtrue
にしたいので、これらで&&
を挟む。
num1 > num2 && num1 > num3
これで、num1
が一番大きい時にtrue
が返ってくるようになる。
真偽値まとめ
いったんここまでの内容をまとめておこう。
プログラム上で、true
、false
の二択を真偽値と呼ぶ。
これはリテラルで、型で言うとboolean型やbool型だ。
で、このtrue
、false
は二つのデータの比較によって返すことができる。それを行うのが、比較演算子。
また、複数の真偽値の組み合わせで最終的な真偽値を決定するのが、論理演算子だ。
ここまでが、真偽値の考え方になる。
条件分岐
ここまでの内容を踏まえた上で、条件分岐に進んでいこう。
条件分岐とは
読んで字のごとく、条件分岐とは、ある条件に従って処理の内容を分岐させる処理のこと。
この条件とは何かというと…これが、真偽値だ。
つまり、言い換えると、ある真偽値がtrue
なら行う処理というのを書くための考え方だ。
今回の3言語では書き方が共通しているので、具体的な書き方と共に見ていこう。
条件分岐の考え方
3言語共通で、以下のように書く。
if(真偽値){
// 真偽値がtrueなら行う処理
}
これで、小括弧の中に書いた内容がtrue
なら、処理を行わせることができる。
これを、通称if文と呼ぶ。この呼び方も3言語共通だ。
また、複数のパターンを考えたい場合もあるだろう。
例えば、ある二つの数字num1
, num2
について、num1
の方が小さい場合、両方等しい場合、num2
の方が大きい場合、といった感じ。
この時の書き方も用意されている。
if(真偽値1){
// 真偽値1がtrueなら行う処理
}else if(真偽値2){
// 真偽値1がfalseかつ、真偽値2がtrueなら行う処理
}else if(真偽値3){
// 真偽値1、真偽値2がfalseかつ、真偽値3がtrueなら行う処理
}
このように、else if
と連続で続けることで、そこの真偽値が初めてtrue
になった時に行われる処理も書くことができる。
この時の注意が、初めてtrue
になった箇所のみ処理が実行される、ということだ。
つまり、一つ目だけfalse
で、二つ目、三つ目がtrue
になったとしても、二つ目の処理だけが行われる。
true
の個所全てが実行されるわけではない。
最後に、そこまでの真偽値が全てfalse
だった場合の書き方も用意されている。
if(真偽値1){
// 真偽値1がtrueなら行う処理
}else if(真偽値2){
// 真偽値1がfalseかつ、真偽値2がtrueなら行う処理
}else if(真偽値3){
// 真偽値1、真偽値2がfalseかつ、真偽値3がtrueなら行う処理
}else{
// これまでの真偽値全てがfalseなら行う処理
}
最後、else
の部分だ。
こうすることで、そこまでが全部false
の場合の処理を書ける。
この、複数の条件による処理の考え方も、ほとんどの言語で行うことができるので覚えておこう。
具体例
では、実際に使ってみよう。
例として、テストの点数point
について、以下のような条件分岐をしてみよう。
- 90点以上なら「S」と表示
- 80~89点なら「A」と表示
- 70~79点なら「B」と表示
- 60~69点なら「C」と表示
- 59点以下なら「D」と表示
よくある大学の単位判定だ。…この区分一般的だよな?
本当はそもそも0から100までとか、数字が整数とか色々条件はあると思うが、今回は数字による区分だけ行おう。
これを、これまでの内容で実装してみる。
Javaによる実装例
まずはJavaから。
class Sample03 {
public static void main(String args[]){
int point = 100;
if(point >= 90){
System.out.print("S");
}else if(point >= 80){
System.out.print("A");
}else if(point >= 70){
System.out.print("B");
}else if(point >= 60){
System.out.print("C");
}else{
System.out.print("D");
}
System.out.print("\n");
}
}
一個目なので、ちょっと詳しく解説していこう。
まず、3行目で変数point
を用意し、100をとりあえず代入してある。優秀な学生だ。
次に、5行目から条件分岐開始。まずは、単純にpoint
が90以上なら、ここが実行される。
つまり、90点以上なら、Sと表示される。これが実行されれば、if文全体が処理終了だ。
そして、7行目。ここは、5行目がfalse
なら…つまり、89点以下の時に初めて評価される。
で、書かれているのは、point
が80以上なら、ということで80~89なら実行されることになる。
これも、実行されればその時点で終わりになる。
以下同じで、9行目、11行目についても、それまでがfalse
でそこがtrue
なら、その対応した内容が表示される。
最後に、13行目でelse
が入っている。
それまでの内容が全部false
ということは…ここでは、point
が59以下の場合に処理が行われる。
これで、狙った出力を分岐させて行うことができる。
ちなみに、16行目は、前回ちょっと解説した通り、出力後に改行を一個挟んでいるだけだ。
実行してみる場合は、point
の数字を色々変えて試してみよう。
C言語による実装例
お次に、C言語。
処理の考え方はJavaと全く同じなので、サンプルソースだけ載せよう。
#include<stdio.h>
int main(){
int point = 100;
if(point >= 90){
printf("S");
}else if(point >= 80){
printf("A");
}else if(point >= 70){
printf("B");
}else if(point >= 60){
printf("C");
}else{
printf("D");
}
printf("\n");
return 0;
}
JavaScriptの実装例
こちらも同じ。
var point = 100;
if(point >= 90){
console.log("S");
}else if(point >= 80){
console.log("A");
}else if(point >= 70){
console.log("B");
}else if(point >= 60){
console.log("C");
}else{
console.log("D");
}
まとめ:真偽値と条件分岐
今回は、真偽値と条件分岐を解説した。
まず、真偽値とは、true
、false
で表される2択だった。
で、これらを表すための、二つのデータを比べる比較演算子、二つの真偽値を比べる論理演算子を扱った。
条件分岐は、真偽値がtrue
なら実行する、という考え方。
組み合わせによって、そこまでがfalse
かつそこがtrue
なら行うelse if
、全てfalse
なら行うelse
も同時に扱った。
特に真偽値は、見た目でtrue
、false
が出てくるわけではない。意識しておこう。
次回は、繰り返し処理を扱おう。
今回の真偽値の内容がどんどん出てくるので、心配だという方は復習しておいて欲しい。
更新情報はTwitterでも呟いている。よかったら、ページ下部のTwitterアイコンから覗いていってほしい。
それでは。
コメント