プログラミングの醍醐味! Javaで“条件式”を理解する【改訂版】Eclipseではじめるプログラミング(3)(2/3 ページ)

» 2009年02月25日 00時00分 公開
[小山博史株式会社ガリレオ]

複雑な条件分岐もできる「if-then-else文」

 次に、条件が成立するときと成立しないときとで処理を分けたい場合のプログラミング方法について解説します。この場合は、もう1つのif文であるif-then-else文を使います。if-then-else文は次のように記述します。条件が成立するときは文1が実行され、成立しないときは文2が実行されます。

if (条件式) 文1 else 文2

 これも直感的に処理の流れを理解できるように図で表してみると、図2のようになります。図では、前処理の後に条件式の判定をして、条件式が真の場合は処理1を実行してから処理3を実行しますが、条件式が偽の場合は処理2を実行してから処理3を実行するという処理の流れを示しています。このうち赤線で囲んだ部分がif-then-else文と対応することになります。

図2 if-then-else文 図2 if-then-else文

 ここで、if文自体も文なので、次のように文2としてif-then文やif-then-else文を記述することもできます。このようにすることで、複数の条件を設定して処理の流れを細かく制御することも可能になります。

if (条件式1) 文1 else if (条件式2) 文2
if (条件式1) 文1 else if (条件式2) 文2 else 文3

コードのインデントもEclipseなら簡単!

 if文を1行で記述すると処理の流れが分かりにくいので、普通は段落(インデント)を付けます。どのようにするかというのは実際に見た方が早いでしょう。下記のように文を字下げするのです。

if (条件式1)
    文1
else if (条件式2)
    文2
else
    文3

 この字下げを簡単にする方法があります。Eclipseのソースコードフォーマット機能を活用すればよいのです。この機能を利用するときの具体的な手順はサンプルプログラムを作成するときに一緒に説明します。このようにインデントを付けることにより、各条件式によってどのように処理が分岐されているかが分かりやすくなります。

関係演算子と等値演算子って何?

 if-then-else文のサンプルに入る前に、評価結果がboolean値になる演算子である関係演算子等値演算子について解説をしておきます。

  • 関係演算子
    • 数値比較演算子
    • instanceof比較演算子
  • 等値演算子
    • 数値等値演算子
    • 真偽等値演算子
    • 参照等値演算子

関係演算子

 「x ≧ 5000」というような式をJavaで表現するためには、関係演算子を使います。関係演算子のうち、数値を比較するのに使用する数値比較演算子の一覧を表1に示します。「 ≧ 」といった比較は「 > 」といった不等号と等号(=)とを組み合わせて記述する点に注意しましょう。

演算子 使用例 意味
< x < y x は y 未満
<= x <= y x は y 以下
> x > y x は y より大きい
>= x >= y x は y 以上
表1 数値比較演算子

注意! 「instanceof比較演算子とは?」

関係演算子には、「instanceof比較演算子」という参照型リファレンス型)の比較をするための演算子もありますが、この時点では数値比較演算子だけを理解しておけばよいので、解説をしていません。

これはオブジェクトの型が一致しているかを比較する演算子なので、クラスとオブジェクトについて解説をした後に説明する予定です。


等値演算子

 等しいとか等しくないという関係を表現するためには、等値演算子を使います。等値演算子のうち、数値を比較するのには数値等値演算子を使い、trueやfalseといった真偽値を比較するのには真偽等値演算子を使います。数値等値演算子、真偽等値演算子の一覧を表2に示します。数学では、等値は「 = 」であり非等値は「 ≠ 」ですが、Javaではそれぞれ「 == 」と「 != 」と記述します。

演算子 使用例 意味
== x == yy x と y は等しい満
!= x != y x と y は等しくない
表2 数値等値演算子と真偽等値演算子

数値等値演算子と真偽等値演算子の微妙な違い

 数値等値演算子と真偽等値演算子の記号は同じですが微妙な違いがあります。Sample30を作成したときと同様の手順で、Sample31のコードをEclipseで作成してみましょう。

 「(a==b)==c」という式ではエラーが発生しませんが、「(ia==ib)==ic」という式ではエラーが発生します。Eclipseでは、赤い波の下線が付き、左側に表示されるバツ印にマウスポインタを置くと、「演算子 == は引数の型 boolean, int で未定義です」と表示されます。

 これは、なぜでしょう?

リスト3
public class Sample31 {

    /**
    * @param args
    */

    public static void main(String[] args) {

        // TODO Auto-generated method stub

        boolean a = true;
        boolean b = true;
        boolean c = true;

        if ((a==b)==c) System.out.println(true);

        int ia = 0;
        int ib = 0;
        int ic = 0;

         if ((ia==ib)==ic) System.out.println(0);
    }
}

 boolean型変数a、b、cを使って、「(a==b)==c」という条件式を記述すると、「 == 」は真偽等値演算子となりコンパイル可能です。ところが、int型変数ia、ib、icを使って「(ia==ib)==ic」という条件式を記述すると==は数値等値演算子となりコンパイルできなくなります。

 コンパイルエラーになるのは、「(ia==ib)」の演算結果がboolean値となるのに対し、icはint型なので、「(ia==ib)」の演算結果の型とicの型が一致しないことが理由です。

論理演算子を組み合わせると……

 iaとibとicがすべて等しいという条件式を指定したい場合は、「(ia==ib) && (ib==ic)」のように論理演算子を組み合わせる必要があります。実際に、そのように変更をすると、コンパイルエラーは消えて、Eclipse上でも赤い波の下線が消えます。

リスト4
public class Sample31 {

    /**
    * @param args
    */

    public static void main(String[] args) {

        // TODO Auto-generated method stub

        boolean a = true;
        boolean b = true;
        boolean c = true;

        if ((a==b)==c) System.out.println(true);

        int ia = 0;
        int ib = 0;
        int ic = 0;

        if ((ia==ib) && (ib==ic)) System.out.println(0);
    }
}

また注意! 「参照等値演算子とは?」

等値演算子には、参照等値演算子というオブジェクトの等値性判定をするための演算子もありますが、この時点では数値等値演算子と真偽等値演算子だけを理解しておけばよいので解説をしていません。

これもinstanceof比較演算子と同様にクラスとオブジェクトについて解説をした後に説明する予定です。


if-then-else文もJavaで書いてみよう

 それでは、単純なif-then-else文サンプルプログラムを動作させてみましょう。if-then文サンプルプログラムを作成したときと同様にしてSample32クラスを作成し、リスト5となるようにコードを追加してください。

リスト5
public class Sample32 {

    /**
    * @param args
    */

    public static void main(String[] args) {

        // TODO Auto-generated method stub

        if (true) System.out.println(true); else System.out.println(false);

        int x;
        x = 1;

        if (x < 3) System.out.println(true); else System.out.println(false);

        if (x >= 3) { System.out.println(true); } else
        if (0<x && x<2) { System.out.println(false); System.out.println(true); }
        else { System.out.println(false); System.out.println(false); }
    }
}

 最初のif文では条件式がtrueなので、「System.out.println(true);」が実行されます。次のif文ではxが1のときは条件式「(x < 3)」がtrueなので、「System.out.println(true);」が実行されます。3つ目のif文では、xが1のときは条件式「(x >= 3)」がfalseなので、この場合はelse以降の文が実行されます。

 ここでは、そこにまたif文がありxが1のときは条件式「(0<x && x<2)」がtrueなので、「{ System.out.println(false); System.out.println(true); }」のブロックが実行されます。ブロックの中では、条件式「(x >= 3)」の判定結果と条件式「(0 < x && x < 2)」の判定結果を順に表示する処理を記述してある点に注意しましょう。これらのことから、実行結果は以下のようになります。

リスト5の実行結果
true
true
false
true

 次ページでは、Eclipseのソースコードフォーマット機能を使ってみましょう。さらに、場合分けが多いときにはコンパクトな「switch文」について説明します。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。