ブロック内で変数を使用

広告

for文は決められた回数だけ繰り返し処理を行うのによく使用される文です。その為、繰り返しを継続するかどうかは回数をカウントするための変数を使って行うことが多くなります。ここではこの変数を値を利用する方法を確認します。

例として11から15までの数値を画面に表示するプログラムを考えてみます。

int num = 11;

for (int i = 0; i < 5; i++){
  System.out.println(num);
  num++;
}

表示する数値を保存するための変数「num」を用意し、for文のブロック内で変数「num」の値を表示した後で1つ増加させています。そしてfor文で5回繰り返しを行っています。

このような場合、for文の条件式で使用している変数を利用することができます。条件式の変数はfor文のブロック内で値を取り出すことができます。では先ほどのサンプルを次のように書き換えてみます。

for (int i = 11; i <= 15; i++){
  System.out.println(i);
}

今回のサンプルでは変数「i」が11から15まで1ずつ増加しながらブロック内の処理を実行しています。ブロック内では変数「i」の値を取得して画面に出力しています。

このようにfor文の条件式で使用する変数はブロック内でも利用できますので、初期値と条件式をうまく設定することでよりプログラムを簡潔に記述することができます。

次のサンプルでは数値を5から1まで1つずつ減らしながら値を画面に出力しています。

for (int i = 5; i <= 1; i--){
  System.out.println(i);
}

今までのサンプルでは変化式で変数の値を1だけ増加させていましたが、今度は1だけ減らすようにしています。

次のサンプルでは数値を20以下の3の倍数を順に画面に出力しています。

for (int i = 3; i <= 100; i += 3){
  System.out.println(i);
}

for文のブロック内で宣言した変数を扱う時の注意点

for文の初期化式などfor文のブロック内で宣言した変数を利用する時には注意すべきことがあります。次の例を見て下さい。

for (int i = 0; i < 5; i++){
  /* ブロック内の処理 */
}

System.out.println(i);

for文が終わった後でfor文の中で宣言した変数の値を画面に出力しています。このサンプルはコンパイルの時点でエラーとなります。

これはブロック内で宣言した変数はブロックの外に出てしまうと使用することができないためです。逆にブロックの外で宣言した変数はブロック内でも使用できます。次の例を見てください。

int a = 0;

for (int b = 0 ; ; ){
  System.out.println(a)    // 変数a は利用可能
  System.out.println(b)    // 変数b は利用可能
}

System.out.println(a)     // 変数a は利用可能
System.out.println(b)     // 変数b は利用不可

このように変数が宣言された位置によってどこでその変数を利用できるのかが決まります。これを変数のスコープ(有効範囲)などと読んだりしますが、ここではブロック内で宣言した変数はブロックが終わると使えなくなるとだけ覚えておいて下さい。

よってfor文の中で使用した変数の値をfor文が終わった後でも使用したい場合には、変数の宣言はfor文の外で行うことで可能となります。

int i;

for (i = 0; i < 5; i++){
  /* ブロック内の処理 */
}

System.out.println(i);

今回は初期化式を例にしましたが、for文のブロック内で変数を宣言した場合も同じです。ブロックがプログラムの中で使われる場合には、変数がどこで宣言されたものか注意するようにして下さい。

サンプル

では簡単な例で試しておきます。

JSample3_1.java

class JSample3_1{
  public static void main(String args[]){
    int i;

    for (i = 3; i <= 20; i += 3){
      System.out.println(i);
    }

    System.out.println("変数の値が" + i + "で条件式がfalseとなりました");
  }
}

コンパイル後に実行すると次のように表示されます。

p3-1

( Written by Tatsuo Ikura )