1. TOPTOP
  2. Webサービス
  3. Android

while(n– > 0)(デクリメント演算子)を使った左下直角三角形の表示について。「明解Java入門編」(P232)より

java_for_android

最近、Android関係の記事が多くなってきました。ですが、その基幹言語であるJavaについて、ちゃんと学習したことがありません。

明解Java入門編(P232)よりのwhile文

なので合間を見ては、明解Java入門編を写経しながら、Javaのお勉強もしてます。今回はその中から気付いたことをひとつ。テキストのP232に、左下が直角の直角三角形を表示させるプログラムがあります。

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();
 		}
	}
}

このプログラムは、返却型の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
星の数: ****

(無限ループ)

インクリメント演算子と、デクリメント演算子の使い方が分かってきました。

〔参考サイト〕