for文とwhile文の使い分けと例!違いを分かりやすく!JavaScript/PHP
JavaScriptやPHPをはじめ、各種プログラミング言語におけるループ処理を行う「for文」と「while文」について、違いや使い分け方を分かりやすく解説します。
一般的に「ループ回数が決まっている場合はfor文」「何回繰り返すか分からない場合はwhile文」と言われますが、今回はより具体的な使用例を挙げながら、それぞれのループ処理について理解を深めていきます。
今回はJavaScriptを例に挙げながら解説していきますが、PHPやその他「C言語から派生した言語」においてもほとんど同じような記述になるため、他の言語を扱う方であってもfor文とwhile文の概念については理解できるような説明になっているはずです。
尚、Python等、for文がforeach文的な扱いになる一部のモダンな言語には当てはまりません。
for文とwhile文の違い
for文とwhile文の違いは、下記のとおりです。
for文 | 指定した回数だけ繰り返す |
---|---|
while文 | 条件を満たす限り繰り返す |
やはり一言で説明しようとすると、「for=回数」「while=条件」という言い回しになってしまいます。
とはいえ、if文やbreak/continueを併せて使用すれば、for文もwhileも同じような処理を行うことができるため、状況によって向き不向きはあるものの、「ニュアンスの違い」くらいに考えておくと良いでしょう。
forとwhileの違いが分からない原因
for文とwhileの違いが分からない原因は、おそらく下記のような「変数が5になるまで繰り返す」というようなカウント・アップ、もしくはカウント・ダウンのループ文で比較してしまっているからでしょう。
//JavaScriptのfor文 for(let i = 1; i <= 5; i++){ //1から5までカウントアップ console.log(i); //コンソールに出力 } //JavaScriptのwhile文 let i = 1; //変数iに1を定義 while(i <= 5){ //変数iが5になるまで console.log(i); //コンソールに出力 i++; //カウントアップ }
上記のfor文とwhile文をそれぞれ実行すると、どちらもコンソールに「1 2 3 4 5」と表示され、まったく同じ結果を返します。
たしかに、上記の例からも「変数を定義するタイミング」や「加算式を書く位置」に違いがあることは分かります。
しかし、このケースではwhile文にもループの「回数」を指定しているため、それぞれのループ文の性質の違いは分かりにくいでしょう。
ちなみに上記の例は、どちらかというとfor文が得意とする(簡潔に書ける・可読性が高い)処理だと言えます。
for文とwhile文のニュアンスの違い
上述したとおり、for文とwhile文の違いは「ニュアンス」にあります。
for文 | 指定した回数だけ繰り返す |
---|---|
while文 | ある結果に辿り着くまで繰り返す |
for文とwhile文の違いが分からない人の多くは、おそらくwhile文を使用する具体的な例が想像できないのではないでしょうか。
具体的な使い分けについては、後述する「for文とwhile文の使い分け方」の章にて解説します。
作ろうとしているプログラムによって、for文の方が少ないコード量で書ける場合があったり、while文の方が可読性が高いコードで書ける場合があったりと、ケース・バイ・ケースです。
そして、if文による分岐やbreak・continueを織り交ぜれば、基本的にはfor文・while文のうちどちらかだけを使用しても同じ結果を得ることが可能になります。
正確には、解析学における「逐次近似法」等の高度な方程式はwhile文でしか求められないそうですが…プログラムを書く上ではfor文もwhile文も同様の結果が得られると考えて良いでしょう。
for文とwhile文の使い分け方
for文とwhile文の使い分け方について、2つの例を用いて解説していきます。
当ページを含め様々な文献で解説されているとおり、基本的には「繰り返す回数が事前に分かっている場合はfor文」で、「ある結果に辿り着くまでに何回のループが必要か分からない場合にはwhile文」です。
今回は、「預金口座に1万円預金した際の金利による残高計算」と「WordPressにおける記事の取得」を例に挙げます。
1万円預金の金利と残高計算
預金口座に1万円を預金し、年に0.05%の金利が付くとしましょう。
つまり、翌年の預金額は1.05倍になっているという前提です。
毎年の金利で増えた額を引き出すことなく「複利」で運用を続けた場合を仮定して、プログラムを組みます。
このとき、「10年後の預金額を求める場合」は10回ループすれば良いと明確に分かるのでfor文を用います。
一方、「預金額が2万円に達するのは何年後かを求める場合」は、何年後に残高が2万円に到達するか(何回ループすれば条件が満たされるか)が分からないため、while文が適しています。
10年後の預金額 | for文 |
---|---|
2万円に達するのに必要な年数 | while文 |
単純なカウント・アップやカウント・ダウンだけでは見えなかったfor文・while文の違いが、明確に分かる事例ではないでしょうか。
これこそが、「回数が分かる場合はfor文、分からない場合はwhile文」と言われる理由です。
WordPressにおける記事一覧の取得
for文とwhile文の使い分け方を理解するために、より現実的かつ身近な例として「WordPressにおける記事一覧の取得」を例にとって見てみましょう。
新着記事を5件取得 | for文 |
---|---|
特定のカテゴリの記事一覧を取得 | while文 |
まず、新着の5記事を取得する例では「5件」とループ回数が決まっていることからfor文を使うことがお分かりいただけるでしょう。
一方で、各カテゴリに属する記事が何件ずつ存在するかについては、カテゴリ毎に記事数が異なりますし、記事が追加されたり削除されたりする度に変動するため、「投稿が存在する限りループする」という条件にてwhile文を用います。
ただし、wp_count_posts()関数を利用して、カテゴリの記事数を取得してからfor文でループ処理することも可能でしょう。
他の例として、JavaScriptでDOMを操作する際にも、対象となる要素の個数(length)を取得してからfor文でループ処理すれば同様の結果を得ることができます。
このように、事前にループ処理の対象となる要素数を取得してしまえば、while文をfor文に置き換えることが可能です。
for文とwhile文の違いを使い分ける
for文とwhile文はどちらもループ処理を行う「繰り返し構文」ですが、それぞれの性質に違いがあり、得意分野が異なります。
どちらかの構文のみを使用しても同様の結果を得ることはできますが、他人が書いたコードを読む際や、過去に自分が書いたコードを読み返す際のことを考慮すると、それぞれの性質を活かして使い分けることで、よりメンテナンス性を向上させることができるでしょう。
for文もwhile文も同じ処理ができることを知った上で、両者の違いを理解し使い分けられるエンジニアを目指したいところです。