▪️問題 AとBが交互に出る無限ループを作ってください。
public class test1{
public static void main(String[] args) {
test2();
}
public static void test2() {
for(int d = 0; ; d++) {
if(d % 2 == 0) {
System.out.println("A");
}
System.out.println("B");
}
}
}
}
▪️実行結果
A
B
B
A
B
B
:
:
▪️解説
ループブロック内で
・System.out.println("B"); は常に実行
だが、
・System.out.println("A"); は条件付き実行
だから。
その条件が if(d % 2 == 0
% は剰余演算子。
この場合「整数2で割った余り」になる。
d は 0, 1, 2, 3, 4, ... なので、その2の剰余を
考えてみればいい。
d%2 == 0 は「偶数だったら」に等しい。
dが偶数だったら
System.out.println("A");
System.out.println("B");
両方が実行されるが、基数だったら
System.out.println("B");
しか実行されない。
それを延々繰り返すから
A
B
と
B
の繰り返しになる。
▪️解説2
以下の様に1ステップずつ机上デバッグを行えばわかるはずです。
1.初期状態d = 0でループ開始。
2.if文の判定。d = 0よりd % 2 == 0が成立 → "A"を出力。
3.if文を抜ける。
4."B"を出力。
5.d++により、d = 1になる。
6.if文の判定。d = 1よりd % 2 == 0は不成立。
7.if文を抜ける。
8."B"を出力。
9.d++により、d = 2になる。
10.if文の判定。d = 2よりd % 2 == 0が成立 → "A"を出力。
11.if文を抜ける。
12."B"を出力。
13.d++により、d = 3になる。
14.if文の判定。d = 3よりd % 2 == 0は不成立。
15.if文を抜ける。
16."B"を出力。
17.d++により、d = 4になる。
18.if文の判定。d = 4よりd % 2 == 0が成立 → "A"を出力。
19.if文を抜ける。
20."B"を出力。
:
:
あとはこれの繰り返しです。
この実装を日本語で書くなら、
・dが偶数の時、"A"を出力する。
・dの値に関係なく、"B"を出力する。
となっています。
dが偶数の時は"A"と"B"が出力され、dが奇数の時は"B"のみが出力されるので、
A
B
B
A
B
B
:
となるのです。
AとBを交互に出力するなら、
・dが偶数の時、"A"を出力する。
・dが奇数の時、"B"を出力する。
という実装にする必要があります。