最近、Android関係の記事が多くなってきました。ですが、その基幹言語であるJavaについて、ちゃんと学習したことがありません。
明解Java入門編(P232)よりのwhile文
なので合間を見ては、明解Java入門編を写経しながら、Javaのお勉強もしてます。今回はその中から気付いたことをひとつ。テキストのP232に、左下が直角の直角三角形を表示させるプログラムがあります。
[php]
import java.util.Scanner;
class IsoscelesTrainingleLB {
static void pushStars(int n) {
while(n– > 0) {
System.out.print("*");
}
}
public static void main(String[] args) {
Scanner stdIn = new Scanner(System.in);
System.out.println("直角三角形を表示します");
System.out.print("段数は:");
int n = stdIn.nextInt();
for (int i = 1; i <= n; i++) {
pushStars(i);
System.out.println();
}
}
}
[/php]
このプログラムは、返却型のvoidメソッドの使い方を教えてくれているのですが、個人的に目を引いたところは、while文の中味です。
(n– > 0)(後置デクリメント演算子)という評価式を見たのは、はじめてだったので、読み流さずに頭をつかってプログラムを分解してみました。
while(n– > 0)(後置デクリメント演算子)の場合
3段の直角三角形を表示させると想定して、17行目から20行目までのfor文の中味を、日本語で詳しく書いてみました。
ループ(i): 1回目 評価式: 3 > 0 評価: true 星の数: * ループ(i): 2回目 評価式: 2 > 0 評価: true 星の数: ** ループ(i): 3回目 評価式: 1 > 0 評価: true 星の数: *** ループ(i): 4回目 評価式: 0 > 0 評価: false 星の数: なし (実行結果) * ** ***
実際には、n = 3です。ループ4回目はありえませんが、デクリメントでnがゼロになっているので、評価もfalseになり、星の表示が止まります。
while(n++ > 0)(後置インクリメント演算子)の場合
while(n– > 0)だけでは、デクリメントのありがたみは分かりません。逆にインクリメント”n++”をしてみましょう。
ループ(i): 1回目 評価式: 3 > 0 評価: true 星の数: * ループ(i): 2回目 評価式: 4 > 0 評価: true 星の数: ** ループ(i): 3回目 評価式: 5 > 0 評価: true 星の数: *** ループ(i): 4回目 評価式: 6 > 0 評価: true 星の数: **** (無限ループ)
“n++”を使うとインクリメント(加算)されていきます。結果、常にtrueが成立するので、無限ループに突入します。その場合、コマンドラインからプログラムの実行を停止させてください(Windowsの場合は”ctrl + z”)。
while(n = 0)の場合
ここまで来ると、オチは見えてしまいますが、“n = 0”でも無限ループに突入します。whileによる評価で、常に”true”が成立するからです。
ループ(i): 1回目 評価式: 3 = 0 評価: true 星の数: * ループ(i): 2回目 評価式: 3 = 0 評価: true 星の数: ** ループ(i): 3回目 評価式: 3 = 0 評価: true 星の数: *** ループ(i): 4回目 評価式: 3 = 0 評価: true 星の数: **** (無限ループ)
インクリメント演算子と、デクリメント演算子の使い方が分かってきました。
〔参考サイト〕