読者です 読者をやめる 読者になる 読者になる

高見知英のかいはつにっし(β)

高見知英のアプリケーション開発日誌 のほか、地域活動などの活動報告ブログ。

ネストの練習

 いよいよネストの練習です。ネストとは主にe-wordsにもあるとおり、構造化プログラミングの部分(判断または繰り返し)がいくつか入れ子になってる状態のことです。たとえば、forの中にforがある状態、ifの中にifがある状態 のコトですね
forの外と中とを上手く分離して考えられればどうってコトないんですけど、いきなり分離して考えるというのも、難しいのかな…。

ここで、中括弧――波括弧の扱いについてちょっと確認。これは、括弧で囲んだエリアを、一つのブロックにするという効果を持ちます。これをスコープと呼びます。
スコープは、命令実行順序としてみると、他の部分とは違う流れになります。forやwhileは、条件を満たさなくなるまでスコープを繰り返し実行しますし、ifは条件を満たす場合のみスコープの中の命令を実行する。
ネストというのは、元々あるスコープの中に、別のスコープが乗っかる状態です。ですから、スコープごとに別々に考えることが出来れば、どうってコトないことなのですよね。

id:tomo_kさん作成のソースを引用して・・・

public class Test {

    public static void main(String[] args) throws Exception {
        for (int i = 1; i <= 9; i++) { // 外側ループ
            for (int j = 1; j <= 9; j++) { // 内側ループ
                System.out.println(i + " × " + j + " = " + (i * j));
            } // 内側ループおしまい
        } // 外側ループおしまい
    }
}

それから、今いるスコープより上で宣言した変数などは、そのスコープと共有できます。――つまりは、変数って宣言したスコープを含め、その中にあるスコープで使うことが出来るという決まりがあります。
ですから、(ネストした内部のループからみれば)外のスコープで使用しているはずの、たとえばループカウンタだとかいったものも参照できるわけです。上の場合なら"外側ループ"からでも、"内側ループ"の部分で宣言した変数を使用可能 というわけですね。
こうやってforループをネストすると、上の例題もそうですが、かけ算の九九の表などのちょっと複雑なループを簡単に表すことが出来ます。次は九九の一覧表を作るそうですが、まあここまでできたんだから問題はないでしょう。まあ、意味をちゃんと理解できてたらの話ですけどね。
あと、先ほどループカウンタも参照できると書きましたが、言うまでもなく参照してループカウンタの値を変更することは出来ません(もちろんforの場合のみですよ)。これについては言語レベルで禁止されてる言語もあるし*1、そのままエラーになることもあります。どちらにしてもあまり見た目のいいやりかたではありませんし、やらないようにしましょう。

*1:Delphiなどでは、ループカウンタのインクリメントに特別な機械語を使ってるようなので、余所で変更されると困るようです