はじめに
プログラミングを学ぶ時において、初学者が悩むのがループや条件分岐の使い方です。
その中でも今回は「ループ構文」特に「while文」について使い方や陥りやすい失敗例について説明していきます。プログラミング初心者の方でもわかりやすいような記事を目指していますので最後まで読んでいってください!
前回説明したfor文については以下の記事で説明しておりますのでご覧ください!
while文の構文
さて、それではまず、while文の基本的な構造を見てみましょう。
Javaでwhile文は以下のような構成で定義されています。
while(条件式){
(処理)
}
while文は「条件式」で成り立っています。この式では、繰り返し処理が実行されるかどうかの判断を行います。条件式が真である間は、繰り返し処理が行われ、偽になると繰り返し処理が終了します。
for文とは違い、更新式がないため、式の更新はwhile文の処理の中で指定する必要があります。詳しくは次の「具体例」の章で説明します。
具体例
具体例1(基本のコード)
さて、具体的な例を見てみましょう。以下のコードは、1から10までの整数を順番に出力するプログラムです。
サンプルコード1
int i = 1;
while(i <= 10){
System.out.println(i);
i++; //値の更新
}
for文とは違って更新式や初期化式がないため、最初に「int i = 1」でループ用の変数を定義して、ループ内でインクリメントを挿入して値を更新することで1ずつ増えながら10までの数を出力する事ができます。
実行結果1
1
2
3
4
5
6
7
8
9
10
サンプルプログラム1を実行した結果です。最初の通り1から10まで数えるプログラムを作成することができました。
具体例2(無限ループ)
while文では簡単に無限ループを実装することができます。条件式を「true」に設定する事によって無限ループになります。
無限ループを使うタイミングとしては「特定の条件が揃った時に停止する」時に有効です。
サンプルコード2
int i = 0;
String[] array = {"イチゴ", "リンゴ", "バナナ", "ブドウ", "パイナップル"};
while(true){
if(array[i] == "ブドウ"){
break;
}
System.out.println(array[i]);
i++;
}
このコードでは配列arrayの中の要素を一つずつ順番に参照し、値が「ブドウ」と一致した時にループを抜けるようなコードです。この実行結果が以下実行結果2になります。
実行結果2
イチゴ
リンゴ
バナナ
先程のコードを実行するとarray[i]の値が「ブドウ」になるまではイチゴ、リンゴ、バナナが出力されますが、array[i]が「ブドウ」の時はif文によってbreakされ処理が終了します。そのため「ブドウ」「パイナップル」は出力されません。
具体例3(複数の条件を使用する)
while文の条件式部分には複数の条件を当てはめることができ、それぞれの条件の間に「かつ」、「または」を意味する記号を当てはめることで複数の条件に当てはまる場合にwhile文の中身を実行する、ということを実現できます。
サンプルコード3(2つの条件をともに満たす時にループの中身を実行する)
2つの条件を「かつ」で結ぶ時は以下のように「&&」で2つの条件を結ぶとともに満たす時にループの中身を実行することができます。
int i = 0;
int j = 1;
while(i == 0 && j == 0){
System.out.println(i);
}
実行結果3
(何も表示されない)
サンプルコード3を実行すると、変数iの初期値が0、変数jの初期値が1であり、ループの条件は「変数i, jがともに0の時」なので、条件式を満たさず何も表示されません。
サンプルコード4(2つの条件のどちらかを満たす時に中身を実行)
2つの条件を「または」で結ぶ時には「||(縦棒2つ)」で2つの条件を結ぶとどちらかを満たす時にループの中身を実行する事ができます。
int i = 0;
int j = 1;
while(i == 0 || j == 0){
System.out.println(i);
i++;
}
実行結果4
0
サンプルコード4を実行すると、変数iの初期値が0、変数jの初期値が1で、条件式は「iが0またはjが1の時」に変数iを表示するため実行結果4のようになります。
陥りやすい失敗例
ループ構文の中で陥りやすい失敗としては「無限ループさせたくないのに無限ループになってしまう」「ループの中身が実行されない」といったようなものがあります。
また、while文を使った時に陥りやすいものとしては「ループ変数の定義忘れ」が挙げられます。
それぞれの失敗例を上げますので、みなさんがミスに陥らないようご覧ください!
失敗例1(無限ループになってしまう)
無限ループにさせたくないのに無限ループになってしまう原因としては「インクリメントやデクリメント忘れ」「条件式の変数の選択ミス」という原因が挙げられます。一つずつ見ていきましょう。
サンプルコード5(インクリメント、デクリメント忘れ)
int i = 0;
while(i <= 10){
System.out.println(i);
}
実行結果5
0
0
0
0
0
0
︙
0
0
0
︙
(以下無限ループ)
先述のようなコードのまま実行すると値が更新されず条件がずっと真のままですので無限ループに陥ってしまいます。
サンプルコード6(変数の選択ミス)
int i = 0;
int a = 0;
while(i <= 10){
System.out.println(a);
a++;
}
実行結果6
0
1
2
3
4
︙
999
1000
1001
︙
(以下無限ループ)
上のようなコードは実行結果の最初はしっかり動いているように思えますが無限ループ担ってしまいます。これはループの条件式ではiを選択していますがインクリメントされているのは変数aのため、iの値が更新されずに無限ループに陥ってしまいます。
このように、無限ループに陥ってしまう原因としては条件式に使っている変数が更新されないことが挙げられます。無限ループに陥ってしまった場合は条件式に使う変数が更新されているかをよく確認しましょう!
失敗例2(ループが実行されない)
無限ループの他にも「ループの中身が実行されない」というミスに陥ることがあります。
この失敗に陥る原因は、ループに使う変数の初期値が条件式の範囲にないことが挙げられます。
サンプルコード7(ループが実行されない)
int i = 0;
while(i > 0){
System.out.println(i);
i++;
}
実行結果7
(何も表示されない)
サンプルコード5を実行すると、変数iは初期値が0ですが、条件式は「iが0より大きい時(→i=0は含まれない)」にのみ繰り返すため、初期値が条件に当てはまらないためにループの中身が実行されません。
この失敗を防ぐには、初期値が条件に当てはまっているか、特に不等号の向きが逆で無いかなどをよく確認しましょう。
おわりに
今回はJavaのwhile文の使い方について解説しました。
もし至らぬ点や「〇〇についても書いたほうがいいよ」などありましたらお問い合わせいただけますとありがたいです!
コメント