[PR] 迷惑メール トップページプロ3ゼミJavaJava入門講座一学期単位3 →1時間目

1時間目 柔軟なプログラムを書くには
(if文)

3−1−1.if文及びif文の条件

 私たちは、状況に応じて判断を下します。
状況は様々あり、その状況に応じて判断を下す事により柔軟に対応する事ができます。
プログラムも同じであり、もしもの状況のときに対応する事により柔軟なプログラムが書けます。

 Javaには、if文及びswitch文があります。
ここでは、最も代表的であり最も使われているif文を説明します。

 if文の構文を示します。

if (条件式 == true) 文
 これが基本のif文です。
if文は、もし…ならば文が実行されます。
文は、一つだけしか書く事ができません(つまり「;」が一回だけかかれる事になる)。
…でない場合は、文が実行されません。
ここで注目すべきところは、条件式ということです(条件とは書かれていない)。
つまり、式を書く事もできるわけです(もちろん条件だけを書く事もできます、例えばtrue又はfalse)。
「== true」ということは、true(真)の時だけが文を実行します。
通常は、「== true」を省略して書きます。
よって、「if (条件式 == true) 文」と書かなくても「== true」はコンパイラが認識しますので、下の例 に示すように書きます。

if (x == y)
    System.out.println("xはyと等しい。");

 これは、「x == y」が等しいなら「xはyと等しい。」と表示されるプログラムです。

 まだ説明してませんでしたが、条件式を書いた場合は、boolean型の値が返されます。
条件式の例を表にしました(この演算子を関係演算子と呼びます)。
説明
x == y xとyが等しい場合はtrue、等しくない場合はfalseを返す
x != y xとyが等しくない場合はtrue、等しい場合はfalseを返す
x > y xがyよりも大きい場合はtrue、等しいか小さい場合はfalseを返す
x < y xがyよりも小さい場合はtrue、等しいか大きい場合はfalseを返す
x >= y xがyと等しいか大きい場合はtrue、小さい場合はfalseを返す
x <= y xがyと等しいか小さい場合はtrue、大きい場合はfalseを返す

 例の「x == y」は、true又はfalseが返され、その結果と「== true」が比較されます。
よって、「if (true) 文」と書かれたif文は、常に文が実行されます。

 if文とは、直接関係がありませんがキーワードの後にスペースを入れると、これが命令文だという事が分かる 為、特別な決まりがない限り入れておいた方がいいでしょう(これはアドバイスです)。

 条件式は、組み合わせる事ができます。
例えば、xが偶数でありyより大きい場合です。
そんな時には、論理演算子を使います。

if (x % 2 == 0 && x > y)
    System.out.println("x = " + x);

 プログラムの「x % 2 == 0」はxが0で割り切れるかを判断し、「x > y」はxがyより大きいかを判断していま す。
「&&」は論理積演算子でANDと同じです。
これによって、xが偶数でありyより大きい場合にxの値が表示されます。

 論理積演算子以外にも論理和演算子があります。
両者の違いを表にまとめました。
優先順位 演算子 意味 説明 結合規則
1 && 論理積演算子(AND) 二つが共にtrueならtrueを返す、どちらか一方でもfalseならfalseを返す。
2 || 論理和演算子(OR) 二つのどちらかがtrueならtrueを返す、両方ともfalseならfalseを返す。

※補足として&&は、falseが決まった時点でfalseが返される為、falseなら右側が評価されず無視されます。

Sample3_1_1.java
public class Sample3_1_1 {
    public static void main(String[] args) {
        new If().view();
    }
}

class If {
    void view() {
        int x = 10, y = 20;

        // == trueを省略できる
        if (x == 10 == true)
            System.out.println("x == 30");
        if (y >= 20)
            System.out.println("y >= 20");

        // &&の場合と!!の場合を試してみる
        if (x % 2 == 0 && x > y)
            System.out.println("(AND):x = " + x);
        if (x % 2 == 0 || x > y)
            System.out.println("(OR):x = " + x);

        int z = 0, answer = 0;
        if (z > 0)
            // zが0より大きければ
            answer = y / z;
        System.out.println("answer = " + answer);
    }
}
x == 30
y >= 20
(OR):x = 10
answer = 0

3−1−2.if文のブロック範囲

 最初に教えたif文では、文を一つだけしか書く事ができなくて不便でした。
そこでブロック({})を付ける事により、複数文が書けるようになります。
if文に限りませんが、ブロックを組み合わせる事により範囲を決める事ができるのです。

 ブロックを付けたif文の書き方は、次のようになります。

if (条件) {
    文
    …
}

…の後は続くのですが、このブロック「{}」の範囲まで広げる事ができます。

if文も文なので、入れ子にする事も可能です。
例えば、次のようにする事が可能です。

if (条件)
    if (条件)
        if (条件)
            文

 ブロックを付けないif文は、文を一つだけ書く事ができ、その文にif文を書ければ…という具合に入れ子に できます。
文は必ず書かなければいけない為、文がなければコンパイルエラーになります。
但しブロック付のif文は、文を書かなくてもコンパイルエラーになりません。

 入れ子にするとすごく見にくいので、ここでもブロックを使う方法があります。
私の場合は、常に文が一つでもブロックを使う事でif文の範囲を明確にしています。
特に、入れ子などをした時に、インデントを忘れると自分の予測とは違った動きになり、気付かないと バグも直りません。
if (条件) {
    if (条件) {
        if (条件) {
            文
        }
    }
}
 どうですか、ブロックを使ったほうが見やすくありませんか。
プログラムが複雑になるにつれてこれが後々効いてきます。

 話がそれてしまいますが、中にはこのような書き方を嫌う人もいます。
それは、コード量が増えてしまう為であり、昔のような性能が古い頃からの習慣かもしれません。
私の意見として現在では処理性能も上がり、Javaが扱う分野ではプログラムの実行速度よりも理解度 を上げることの方が合っているでしょう。
Javaはオブジェクト指向なためどうしても非オブジェクト指向な言語よりもメモリやCPUを消費します。
Javaプログラマはその事を常に意識する事が大事です。
Javaのバージョンが上がり改良される事やJavaプログラマが研究を続ける事により少しずつですがよくなって きています。
そのような工夫は大事であり、情報を積極的に収集しましょう。

 話を元に戻しますが、ブロックはここまでJavaを習ってきた人はすでに使っているのです。
「class Sample3_1_1 {…}」や「void view() {…}」といったように使っていたのです。
ここでは、if文のブロックに焦点をしぼり説明を続けます。
大事な事は、ブロックを使う事によりそこに新たな範囲が生まれる事です。
その中で、宣言した変数は外で使う事はできないのです。
ブロックの中であればその変数を使う事ができるという事です。
当然そこに小さいブロックがあろうと自分自身のブロックの範囲なら有効です。

 ブロックの範囲を試すSample3_1_2を確かめてください!

Sample3_1_2.java
public class Sample3_1_2 {
    public static void main(String[] args) {
        new Block().view();
    }
}

class Block {
    void view() {
        int     x = 10;

        // ブロックを使う事により1つ以上分を書く事ができる。
        if (x > 0) {
            int y = 10 / x;             // xは内側のブロックなためアクセスできる
            System.out.println("y = " + y);
        }

        // y = 30;  // yはブロックの範囲を超えている為、アクセスできない。コンパイルエラー

        // if文のyはブロックの中だけ有効な為、yを使用する事ができる
        int     y = 30;
        
        {
            // このようなブロックの使い方もできる。
            int     z = y;
            System.out.println("z = " + z);
        }
        
        // z = 10;  // zはブロックの範囲を超えている為、アクセスできない。コンパイルエラー
    }
}
y = 1
z = 30



単位2 ソースの基本に戻る     2時間目 柔軟なプログラムを書くには(if〜else文と組合せ)に進む

単位3 判断が分かるときはに戻る

トップページに戻る