プログラミングをやっていると、必ずと言っていいほど行う処理というのがいくつかある。
例えば、前回解説した変数。これがないとほぼシステムを組めない。
…だが、これだけではない。
ある処理を行いたいとき、様々な状況に対応する必要があるだろう。
例えば、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アイコンから覗いていってほしい。
それでは。


コメント