|
|
|||||||||||||||||||||||||||||
| 条件分岐 |
H.Kamifuji . |
|
条件に応じて実行する処理を分ける方法を確認します。具体的にはif文及びswitch文の使い方を学習していきます。 当ページでは、Linux CentOS7 の Gnome で動作テストしています。 現在(2021/08)では、JDK-16.0.2 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2021/11)では、JDK-17.0.1 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2023/04)では、JDK-20.0.1 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2024/10)では、JDK-23 にアップされています。一部、上位互換について、見直しを行っていきます。 |
|
|
|
条件式を評価した結果に応じて処理を分けたい場合に使われるのがif文です。書式は次のようになっています。
if (条件式){
実行する文1;
実行する文2;
...
}
if文では条件式を評価しtrueだった場合には「{」から「}」のブロック内に記述された文を実行します。条件式は関係演算子及び論理演算子などを使って記述します。(関係演算子及び論理演算子を参照して下さい)。条件式がfalseだった場合にはブロック内の処理は何も行わずif文の次の文へ処理が移ります。 なお条件式がtrueだった時に実行する文が1つだった場合には「{」と「}」を省略して次のように記述することもできます。 if (条件式) 実行する文;実際には次のように記述します。
int num = 90;
if (num > 80){
System.out.println("合格です");
}
上記の例では変数「num」の80より大きかった場合にはブロック内の処理を実行して「合格です」と画面に表示します。では簡単な例で試しておきます。 サンプルプログラム下記のサンプルを実行してみよう。
class JSample1_1{
public static void main(String args[]){
for (int i = 0 ; i < 5 ; i++){
if (i % 2 == 0){
System.out.println(i + "は偶数です");
}
if (i % 2 != 0){
System.out.println(i + "は奇数です");
}
}
}
}
上記をコンパイルした後で実行すると次のように表示されます。[xxxxxxxx@dddddddddd If]$ java JSample1_1 0は偶数です 1は奇数です 2は偶数です 3は奇数です 4は偶数です [xxxxxxxx@dddddddddd If]$基本の書式では条件式がtrueだった場合に実行する処理を記述できましたので、今回のサンプルでは偶数になる場合と奇数になる場合でif文を別々に用意して偶数であっても奇数であっても画面出力するようにしています。次のページでは条件式がtrueだった場合に加えて条件式が偽だった場合も実行する処理を記述する方法を確認します。 |
|
if文を使えば条件式がtrueの時だけ行う処理を記述できますが、条件式がfalseだった場合の処理も合わせて記述することができます。その場合の書式は次の通りです。
if (条件式){
trueの時に実行する文1;
trueの時に実行する文2;
...
}else{
falseの時に実行する文1;
falseの時に実行する文2;
...
}
条件式を評価し、trueだった場合には条件式の後のブロック内の文を実行し、falseだった場合にはelseの後のブロック内の文を実行します。条件式の評価は必ずtrueかfalseになるためどちらか一方のブロック内の文だけを実行することになります。なお実行する文が1つだった場合には「{」と「}」を省略して次のように記述することもできます。 if (条件式) trueの時に実行する文; else falseの時に実行する文;実際には次のように記述します。
int num = 90;
if (num > 80){
System.out.println("合格です");
}else{
System.out.println("不合格です");
}
上記の例では変数「num」の値が80より大きかった場合には「合格です」と画面に表示します。そして変数「num」の値が80以下だった場合には「不合格です」と画面に表示します。では簡単な例で試しておきます。 サンプルプログラム下記のサンプルを実行してみよう。
class JSample2_1{
public static void main(String args[]){
for (int i = 0 ; i < 5 ; i++){
if (i % 2 == 0){
System.out.println(i + "は偶数です");
}else{
System.out.println(i + "は奇数です");
}
}
}
}
上記をコンパイルした後で実行すると次のように表示されます。[xxxxxxxx@dddddddddd If]$ java JSample2_1 0は偶数です 1は奇数です 2は偶数です 3は奇数です 4は偶数です [xxxxxxxx@dddddddddd If]$前項のページのサンプルと同じ結果となりますが、前のページでは2つのif文を使って偶数と奇数を別々に判別に処理を実行していました。今回は一つのif文で偶数の時と奇数の時の処理をそれぞれ実行しています。 |
|
ここまでは一つの条件式を使って条件分岐を行ってきましたが、今度は複数の条件式を使いより複雑な条件文を行ってみます。書式は次の通りです。
if (条件式1){
条件式1がtrueの時に実行する文1;
条件式1がtrueの時に実行する文2;
...
}else if (条件式2) {
条件式1がfalseで条件式2がtrueの時に実行する文1;
条件式1がfalseで条件式2がtrueの時に実行する文2;
...
}else if (条件式3) {
...
...
}else{
全ての条件式が共にfalseの時に実行する文1;
全ての条件式が共にfalseの時に実行する文2;
...
}
複数の条件式が使われている場合は上の条件式から順に評価していきます。まず条件式1を評価しtrueだった場合は直後のブロック内の処理を実行してif文を終了します。条件式1の評価がfalseだった場合だけ次の条件式2を評価します。条件式2がtrueだった場合には直後のブロック内の処理を実行してif文を終了します。このように順に条件式を評価し、全ての条件式がfalseだった場合にelseの後のブロック内の文を実行します。なお全ての条件式がfalseだった時に実行されるelse句については必要無ければ省略できます。
if (条件式1){
条件式1がtrueの時に実行する文1;
条件式1がtrueの時に実行する文2;
...
}else if (条件式2) {
条件式1がfalseで条件式2がtrueの時に実行する文1;
条件式1がfalseで条件式2がtrueの時に実行する文2;
...
}
注意して頂きたいことはいずれかの条件式でtrueとなった場合、その直後のブロック内の処理だけをしてif文は終了するということです。後の条件式でtrueとなるような場合であっても一度条件式がtrueと評価されるとそれ以降の条件式は評価されませんので注意して下さい。実際には次のように記述します。
int num = 90;
if (num > 80){
System.out.println("合格です");
}else if (num > 70){
System.out.println("追試です");
}else{
System.out.println("不合格です");
}
上記の例では変数「num」の値が80より大きかった場合には「合格です」と画面に表示します。そして変数「num」の値が80以下だった場合で70よりも大きかった場合には「追試です」と画面に表示します。変数「num」の値が70以下だった場合には「不合格です」と画面に表示します。では簡単な例で試しておきます。 サンプルプログラム下記のサンプルを実行してみよう。
class JSample3_1{
public static void main(String args[]){
int suugaku, eigo;
suugaku = 90;
eigo = 75;
System.out.println("数学:" + suugaku + "、英語:" + eigo);
if (suugaku > 80 && eigo > 80){
System.out.println("合格です");
}else if (suugaku > 80 || eigo > 80){
System.out.println("補習を受けて下さい");
}else{
System.out.println("不合格です");
}
suugaku = 82;
eigo = 91;
System.out.println("数学:" + suugaku + "、英語:" + eigo);
if (suugaku > 80 && eigo > 80){
System.out.println("合格です");
}else if (suugaku > 80 || eigo > 80){
System.out.println("補習を受けて下さい");
}else{
System.out.println("不合格です");
}
}
}
上記をコンパイルした後で実行すると次のように表示されます。[xxxxxxxx@dddddddddd If]$ java JSample3_1 数学:90、英語:75 補習を受けて下さい 数学:82、英語:91 合格です [xxxxxxxx@dddddddddd If]$ |
|
ある変数の値を複数の値と比較し、値に応じた処理を行うような場合を考えてみます。if文を使って記述すると次のようになります。
int num = 3;
if (num == 1){
System.out.println("非常に不満");
}else if (num == 2){
System.out.println("少し不満");
}else if (num == 3){
System.out.println("どちらとも言えない");
}else if (num == 4){
System.out.println("少し満足");
}else if (num == 5){
System.out.println("大変満足");
}
このようにif文を使っても記述できますが、対象となる値毎に処理を分けるにはswitch文を使って記述することもできます。switch文の利用switch文は対象の式を評価した結果の値に応じ、値に一致するラベルの位置へ処理を移すために使います。条件分岐とは厳密には少し違いますが同じような使い方ができる文ですす。switch文の書式は次のようになっています。
switch (式){
case 定数1:
実行する文1;
実行する文2;
...
break;
case 定数2:
実行する文1;
実行する文2;
...
break;
}
switch文ではまず式を評価します。式には単に整数の値が代入された変数などを単に記述してもいいですし、計算式などを記述することも可能です。ただいずれの場合であっても式の評価した結果が整数でなければなりません。浮動小数点数や文字列などは記述できません。また整数であってもlong型の値は使用できません。式には例えば次のように記述します。
int num = 3;
switch (num){ // 変数の値が式を評価した値
...
}
switch (num % 2){ // 演算結果が式を評価した値
...
}
次にswitch文の「{」から「}」のブロック内に実行したい処理を羅列していきます。
int num = 3;
switch (num){
System.out.println("非常に不満");
System.out.println("少し不満");
System.out.println("どちらとも言えない");
System.out.println("少し満足");
System.out.println("大変満足");
}
switch文は式を評価した値に一致するラベルへ処理を移動させるために使われます。そこでどの値だったらどの処理を行うのかを指定するためにブロック内にラベルを記述していきます。ラベルは次のような形式となっています。case 定数:ブロック内にラベルを記述すると、式を評価した値と一致するラベルのところへ処理を移すことができます。例えば5つのラベルを記述すると次のようになります。
int num = 3;
switch (num){
case 1:
System.out.println("非常に不満");
case 2:
System.out.println("少し不満");
case 3:
System.out.println("どちらとも言えない");
case 4:
System.out.println("少し満足");
case 5:
System.out.println("大変満足");
}
ラベルに書いた値が「1」「2」「3」「4」「5」ですので、式の値が1から5の場合に対応するラベルの位置へ処理が移ります。今回の場合、変数「num」の値が3ですので「case 3:」のラベルの位置に処理が移ります。そしてその後に記述された「System.out.println("どちらとも言えない");」が実行されます。注意して頂きたいのはあくまでラベルが書かれた位置に処理が移るだけということです。ラベルの位置へ移動した後はswitch文の最後までそれ以降の文を順に実行していきます。よって「System.out.println("どちらとも言えない");」が実行された後は「System.out.println("少し満足");」と「System.out.println("大変満足");」が実行されます。 もしもラベルの位置へ移動した後に、次のラベルの前まで来たらswitch文を終了させたい場合にはbreak文を使います。break文についてはまた別のページで詳しく解説しますが、switch文の中でbreak文が実行されるとswitch文を終了します。具体的には次のように記述します。
int num = 3;
switch (num){
case 1:
System.out.println("非常に不満");
break;
case 2:
System.out.println("少し不満");
break;
case 3:
System.out.println("どちらとも言えない");
break;
case 4:
System.out.println("少し満足");
break;
case 5:
System.out.println("大変満足");
break;
}
上記のようにbreak文を記述するとbreak文を実行した時点でswitch文は終了します。よって上記の場合では「System.out.println("どちらとも言えない");」が実行された後に「break;」が実行されてswitch文は終了します。以上がswitch文の大まかな使い方です。if文を使えば同じようなことが記述できる場合が多いのですが一つの変数の値に応じて処理を分けたい場合にはswitch文の方が見やすく記述できる場合があります。 default句式の値と一致するラベルが無かった場合は何も実行せずにswitch文を終了しますが、一致するラベルが無かった場合に何か実行させたい処理がある場合にはdefault句を使います。書式は次の通りです。
switch (式){
case 定数1:
実行する文;
...
break;
case 定数2:
実行する文;
...
break;
default:
実行する文1;
実行する文2;
...
}
上記の場合、式を評価した結果の値が、定数1にも定数2にも一致しなかった場合には「default:」の位置に処理が移ります。そしてその後に書かれた文が順に実行されていきます。例えば次のように記述します。
int num = 3;
switch (num){
case 4:
System.out.println("少し満足");
break;
case 5:
System.out.println("大変満足");
break;
default:
System.out.println("満足していない");
}
上記の場合、変数「num」の値が4または5以外の場合には全て「System.out.println("満足していない");」の文を実行します。では簡単な例で試しておきます。 サンプルプログラム下記のサンプルを実行してみよう。
class JSample4_1{
public static void main(String args[]){
for (int num = 2; num < 6 ; num++){
System.out.println("num = " + num);
switch (num){
case 4:
System.out.println("少し満足");
break;
case 5:
System.out.println("大変満足");
break;
default:
System.out.println("満足していない");
}
}
}
}
上記をコンパイルした後で実行すると次のように表示されます。[xxxxxxxx@dddddddddd If]$ java JSample4_1 num = 2 満足していない num = 3 満足していない num = 4 少し満足 num = 5 大変満足 [xxxxxxxx@dddddddddd If]$ |
|
switch文におけるラベルは処理の移動先の目印でしかないので複数のラベルを続けて記述することも可能です。例えば次のような使い方はよく行います。
int num = 3;
switch (num){
case 1:
case 2:
System.out.println("不満がある");
break;
case 3:
System.out.println("どちらとも言えない");
break;
case 4:
case 5:
System.out.println("満足している");
}
上記では変数「num」の値が1または2の時には「System.out.println("不満がある");」を実行します。また変数「num」の値が4または5の時には「System.out.println("満足している");」を実行します。このようにswitch文におけるラベルは目印でしかありませんので、任意の位置にラベルを何枚も付けておくことができます。 では簡単な例で試しておきます。 サンプルプログラム下記のサンプルを実行してみよう。
class JSample5_1{
public static void main(String args[]){
for (int num = 2; num < 6 ; num++){
System.out.println("num = " + num);
switch (num){
case 1:
case 2:
System.out.println("不満あり");
break;
case 3:
System.out.println("どちらでもない");
break;
case 4:
case 5:
System.out.println("満足している");
}
}
}
}
上記をコンパイルした後で実行すると次のように表示されます。[xxxxxxxx@dddddddddd If]$ java JSample5_1 num = 2 不満あり num = 3 どちらでもない num = 4 満足している num = 5 満足している [xxxxxxxx@dddddddddd If]$ |
|
switch文において式を評価した後に一致するラベルへ移動した後は、switch文の最後に達するか又はbreak文を実行するまでは順に処理が実行されていきます。例えば次の例を見てください。
int num = 1;
switch (num){
case 1:
System.out.println("不満がある");
case 2:
System.out.println("どちらとも言えない");
break;
case 3:
System.out.println("満足している");
}
上記を実行すると次のように画面に表示されます。不満がある どちらとも言えないこの結果は恐らくプログラムの作者が意図していないものだと思います。ただbreak文を記述するしないは自由であるため意図的にbreak文を記述しないことも可能です。例えば次の例を見てください。
int num = 1;
switch (num){
case 1:
System.out.print("スープ、デザート付き");
case 2:
System.out.println("麻婆豆腐");
}
この場合、数値が1なら「スープ、デザート付き麻婆豆腐」と表示され、数値が2なら「麻婆豆腐」と表示されます。このようにbreak文を記述するしないは任意であるということと、場合によっては意図的に記述しないこともできることを覚えておいて下さい。では簡単な例で試しておきます。 サンプルプログラム下記のサンプルを実行してみよう。
class JSample6_1{
public static void main(String args[]){
int num = 1;
switch (num){
case 1:
System.out.print("スープ、デザート付き");
case 2:
System.out.println("麻婆豆腐");
}
}
}
上記をコンパイルした後で実行すると次のように表示されます。[xxxxxxxx@dddddddddd If]$ java JSample6_1 スープ、デザート付き麻婆豆腐 [xxxxxxxx@dddddddddd If]$ |
|