この記事ではプログラミングのfor文について、わかりやすく解説します。
for文とは?
for文とは、プログラミングで「繰り返し処理」をするための制御構文です。
制御構文とは「if文」や「for文」のように、プログラムの処理の流れをコントロールする構文のことをいいます。
for文を使うと「同じ処理を好きな回数だけ繰り返す」ことができます。
for文は「forループ」や「繰り返し文」と呼ばれることもあります。
for文はどんなときに使う?
プログラムを書いていると、同じ処理を何度も繰り返したいことがあります。
こういうときにfor文を使います。
たとえば、1ヶ月の予定表を見て「バイトのシフトが入っている日」をチェックするとします。
このとき「シフトが入っているかをチェックする処理」は、毎回同じです。
これを31日分繰り返します。
○月1日のシフトをチェックする
○月2日のシフトをチェックする
○月3日のシフトをチェックする
○月4日のシフトをチェックする
○月5日のシフトをチェックする
...
○月31日のシフトをチェックする
この処理を31回も書いていたら、コードの長さが大変なことになりそうです。
試しに31日分のシフト表(JSON形式)があると仮定して、この処理を書いてみましょう。
thisMonthShift = {
"day1": null,
"day2": "1200-1600",
...
"day31": "1200-1800"
}
if (thisMonthShift["day1"] != null) {
console.log(
"今月1日にアルバイトがあります。"
+ "時間は"
+ thisMonthShift["day1"]
+ "です。"
);
} else {
console.log(
"今月1日にアルバイトはありません。"
);
}
if (thisMonthShift["day2"] != null) {
console.log(
"今月2日にアルバイトがあります。"
+ "時間は"
+ thisMonthShift["day2"]
+ "です。"
);
} else {
console.log(
"今月2日にアルバイトはありません。"
);
}
...
if (thisMonthShift["day31"] != null) {
console.log(
"今月31日にアルバイトがあります。"
+ "時間は"
+ thisMonthShift["day31"]
+ "です。"
);
} else {
console.log(
"今月31日にアルバイトはありません。"
);
}
3日分の処理を抜粋しただけもこのボリュームです。31日分ならもっと長くなります。
このような長いコードはとても見づらく、デバッグも大変になります。
for文を使うことで、このようなコードがシンプルになり、デバッグも簡単になります。
for文の書き方
for文の書き方を説明します。
基本のfor文
for文は以下のように書きます。
※ここではJavaScriptで例を示します。他の言語のfor文を見たい方は後述の「【言語別】for文の書き方」を参照してください。
for (初期化式; 条件式; 変化式){
// 繰り返す処理
}
具体例を見てみましょう。
以下は、同じ処理を10回繰り返すfor文です。
for (let i = 0; i < 10 i++) {
console.log(i);
}
for文の構成要素
for文の構成を詳しく説明しましょう。
for文の基本構造はこのようになっています。
for (初期化式; 条件式; 変化式){
// 繰り返す処理
}
前提として、for文では「整数型の変数」を使って、繰り返し回数を記録します。
「整数型の変数」には「変数i」を使うのが一般的です。
「初期化式」の部分で、変数iを「初期化」します。
for (let i = 0; 条件式; 変化式){ // 「let i = 0;」が初期化式
// 繰り返す処理
}
「初期化」というと難しく感じるかもしれませんが「let i = 0;」のように変数を宣言して値を代入するだけです。
このようにすると、for文の中で変数iを使えるようになります。
次に「条件式」の部分で、繰り返す条件を設定します。
for (let i = 0; i < 10; 変化式){ // 「i < 0;」が条件式
// 繰り返す処理
}
条件式が満たされる間、ずっと処理が繰り返されます。
ここでは「i < 10」と書いたので、変数iが10より小さい間、for文の処理が繰り返されます。
最後に「変化式」を書きます。
for (let i = 0; i < 10; i++){ // i++が変化式
// 繰り返す処理
}
変化式には、1回のループで「変数iをどのように変化させるか」を書きます。
ここでは「i++」と書いたので、1回のループが終わるたびに、変数iが1ずつ増えます。
「i++」は「インクリメント」といって「変数iに1を加算する処理」です。
これは「i = i + 1」と同じです。
for文を以下のように書いても同じように動作します。
for (let i = 0; i < 10; i = i + 1){ // i = i + 1が変化式
// 繰り返す処理
}
ただし「i = i + 1」と書くのは大変なので「i++」と書くのが一般的です。
for文の練習問題
for文の基本的な構造は理解できたでしょうか?
練習として、以下のfor文を書いてみましょう。
練習問題1
初期化式が「let i = 0;」、条件式が「i < 100;」、変化式は「i++」のfor文を書いてください。
練習問題2
初期化式が「let i = 10;」、条件式が「i <= 20;」、変化式は「i++」のfor文を書いてください。
練習問題3
変数iを用いて、同じ処理を100回繰り返すfor文を書いてください。
練習問題4
変数iが「5から25まで」の間、繰り返し処理をするfor文を書いてください。
【解答例】練習問題1
初期化式「let i = 0;」、条件式「i < 100;」、変化式「i++」をfor文の構造に当てはめるだけです。
for (let i = 0; i < 100; i++) {
// 任意の処理
console.log(i);
}
for文の中に「console.log(i);」を記述すると、0から99までの100個の整数が順番に出力されます。
【解答例】練習問題2
初期化式「let i = 10;」、条件式「i <= 20;」、変化式「i++」をfor文の構造に当てはめるだけです。
for (let i = 10; i <= 20; i++) {
// 任意の処理
console.log(i);
}
初期化式が「let i = 10」なので、変数iが10の状態からスタートします。また、条件式が「i <= 20」なので、iが20になるまでfor文が繰り返されます。
for文の中に「console.log(i);」を記述すると、10から20までの11個の整数が順番に出力されます。
【解答例】練習問題3
同じ処理を100回繰り返すfor文です。練習問題1の解答例と同じコードで実現できます。
for (let i = 0; i < 100; i++) {
// 任意の処理
console.log(i);
}
for文の中に「console.log(i);」を記述すると、0から99までの100個の整数が順番に出力されます。
別の解答例として、変数iを「let i = 1;」で初期化し、条件式を「i <= 100」とすると「console.log(i);」で1から100までの100個の整数を出力できます。
for (let i = 1; i <= 100; i++) {
// 任意の処理
console.log(i);
}
【解答例】練習問題4
変数iが「5から25まで」の間、繰り返すので変数iを「let i = 5;」で初期化し、条件式を「i <= 25;」とするのがよいでしょう。
for (let i = 5; i <= 25; i++) {
// 任意の処理
console.log(i);
}
for文内に「console.log(i);」を記述すると、5から25までの整数が出力されます。
条件式は「i < 26」でも問題ありません。
for (let i = 5; i < 26; i++) {
// 任意の処理
console.log(i);
}
同様に、5から25までの整数を出力します。
for文のフローチャート
for文をフローチャートで表すと以下のようになります。
多重ループ(for文の中にfor文を書く)
for文は入れ子にして書くことができます。
for文の中にfor文を書けるということです。
これは、たとえば表形式データの全要素を処理したいときに使えます。
for (let i = 0; i < 3; i++) {
for (let j = 0; j < 3; j++) {
console.log(i + ',' + j);
}
}
// 0, 0
// 0, 1
// 0, 2
// 1, 0
// 1, 1
// 1, 2
// 2, 0
// 2, 1
// 2, 2
外側のfor文では変数iを使っていますが、内側のfor文では変数jを使っていることに注目してください。
多重のfor文を書くときには、このように、それぞれのfor文で別々の変数を設定します。
こうしないと、変数に入っている値が、どちらのfor文の繰り返し回数なのか分からなくなってしまうからです。
このことを忘れて、両方のfor文で同じ変数を使うと、意図しない動きになるので注意しましょう。
for (let i = 1; i < 3; i++) {
for (let i = 1; i < 3; i++) { // 内側でも変数iを使ってしまっている
console.log(i);
}
}
// 1
// 2
// 1
// 2
// ↑意図しない動きになっている
ちなみに、3重のfor文を書くときは、変数i, j, kを使うことが多いです。
for (let i = 0; i < 3; i++) {
for (let j = 0; j < 3; j++) {
for (let k = 1; k < 3; k++) {
console.log(i + ',' + j + ',' + k);
}
}
}
3種類の文字を使うことで、3重ループの繰り返し回数を保存できます。
ただし、3重以上のfor文は計算処理が重くなりがちです。
データが数百件程度ならfor文を3重に書いても全く問題ありませんが、データ数が大きい場合は3重のfor文では遅すぎることがあります。
プロのエンジニアは、3重以上のfor文を書かなくてはならなくなった場合、もっと効率的な方法がないかを検討します(データが少ない場合はそのまま3重のfor文を使うこともあります)。
初学者のうちは深く考えなくて構いませんが、「for文のネストは深くならないほうがいい」ということを頭の片隅に入れておくと良いです。
※なぜ3重のfor文の処理が重いのかについて、気になる方は「アルゴリズム 計算量」というキーワードで検索して調べてみてください。
for文の条件分岐(if文と組み合わせる)
for文は、if文と組み合わせることもできます。
例として、FizzBuzzのアルゴリズムを紹介しましょう。
FizzBuzzとは「1から順に数字を数え、3の倍数のときはFizz、5の倍数のときはBuzz、それ以外は普通に数字をいう」ゲームです。
以下のようになります。
1, 2, Fizz, 4, Buzz, Fizz, 7, 8, Fizz, Buzz, 11, Fizz, 13, 14, FizzBuzz, 16, 17, …
3の倍数かつ5の倍数のときはFizzBuzzとします。
このプログラムをfor文とif文を組み合わせて書いてみましょう。
まずは、1から100までの整数を出力するfor文を書きます。
for (let i = 1; i <= 100; i++) {
// ここにFizzBuzzの処理を書く
}
初期化式を「let i = 1;」、条件式を「i <= 100」とします。
次に、for文の中にif文を書きます。
3の倍数は「Fizz」になるので、iが3の倍数のときに「Fizz」を出力します。
if文で「iが3の倍数」であるかを判定します(条件式は「i % 3 == 0」です)。
for (let i = 1; i <= 100; i++) {
if (i % 3 == 0) {
console.log("Fizz");
}
}
5の倍数のときは「Buzz」になるので、iが5の倍数のときに「Buzz」を出力します。
if文で「iが5の倍数」であるかを判定します(条件式は「i % 5 == 0」です)。
for (let i = 1; i <= 100; i++) {
if (i % 3 == 0) {
console.log("Fizz");
}
if (i % 5 == 0) {
console.log("Buzz");
}
}
これでFizzとBuzzの処理を書くことができました。
しかし、このままだと「3の倍数かつ5の倍数」のときに「FizzBuzz」と出力できません。
「3の倍数かつ5の倍数」のときに「FizzBuzz」と出力する処理を先に実行し、それに該当しない場合はFizzとBuzzをそれぞれ処理するようにします。
for (let i = 1; i <= 100; i++) {
if (i % 3 == 0 && i % 5 == 0) {
console.log("FizzBuzz");
} else if (i % 3 == 0) {
console.log("Fizz");
} else if (i % 5 == 0) {
console.log("Buzz");
}
}
最後に、3の倍数でも5の倍数でもないときに、数字をそのまま出力します。
for (let i = 1; i <= 100; i++) {
if (i % 3 == 0 && i % 5 == 0) {
console.log("FizzBuzz");
} else if (i % 3 == 0) {
console.log("Fizz");
} else if (i % 5 == 0) {
console.log("Buzz");
} else {
console.log(i);
}
}
これでFizzBuzzのアルゴリズムの完成です。
このようにfor文はif文と合わせて使うことができます。
FizzBuzzのアルゴリズムは意外と難しいので、もう一度コードを見ずに、自力で考え直してみてください。
for文を書く練習にもなりますよ。
for文で配列を処理する
for文は配列を処理するためにも使います。
たとえば、曜日の配列を順番に処理したいとき、以下のように処理します。
const daysOfWeek = ["日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日"];
for (let i = 0; i < daysOfWeek.length; i++) {
let day = daysOfWeek[i];
console.log(day);
}
初期化式は「let i = 0;」、変化式は「i++」ですが、条件式を「i < daysOfWeek.length;」としています。
for文の条件式を「i < 配列の長さ;」とすることで、その配列の長さだけ繰り返し処理ができるというわけです。
そして、for文の内側では「daysOfWeek[i]」のように変数iを使って配列の要素を取得します。
このようにして、for文で配列の要素を順に処理することができます。
その他の配列処理
上記では、for文と変数iを使って配列を処理しました。
しかし、言語によっては、変数iを使わなくても簡単に配列を処理できる場合があります。
たとえば、JavaScript(ES6以降)では「for 要素 of 配列」という構文を使って配列を処理できます。
for (let day of daysOfWeek) {
console.log(day);
}
「for … of」を使ったほうがコードがシンプルで読みやすいですね。
他にも、Pythonでは「for 要素 in リスト」という構文で、配列(リスト)を処理できます。
for day in daysOfWeek:
print(day)
C#では「foreach文」を使って配列を処理できます。
foreach (string day in daysOfWeek) {
System.Console.WriteLine(day);
}
このように、配列を処理するための構文を使うとコードが簡潔になる場合があります。
「【言語別】for文の書き方」で各言語の配列処理をまとめているので参考にしてください。
for文でよく起こるエラーとデバッグ方法
for文でよく起こるエラーとそのデバッグ方法を紹介します。
1.無限ループ
for文の条件式が永久に満たされないとき、無限ループが発生します。
無限ループが発生すると、環境がフリーズするか、強制的に処理が停止します。
たとえば、以下のようなコードを書くと無限ループに陥ります。
for (let i = 0; i >= 0; i++) {
console.log(i);
}
条件式が「i >= 0;」となっていますが、ここが無限ループになる原因です。
初期化式は「let i = 0;」、変化式は「i++」なので、変数iは「0, 1, 2, 3, …」と増えていきます。
しかし、条件式が「iが0以上である間は繰り返す」という条件になっているため、このfor文は終了せず永久に繰り返し処理を続けます。
このように、無限ループはちょっとしたコーディングミスが原因で発生しますが、エラーメッセージが出ないこともあり厄介です。
「無限ループ」のデバッグ方法
無限ループをデバッグ・修正するには、以下のことを試しましょう。
- for文で処理が落ちる場合は無限ループを疑う
- 条件式をよく確認する
- 変化式をよく確認する
- デバッガを使う
1. for文で処理が落ちる場合は無限ループを疑う
無限ループが発生した場合、エラーメッセージを出力せずに処理が停止する場合があります。
for文で処理が重くなったり、環境がフリーズする場合は、無限ループの発生を疑いましょう。
この場合はコードを実行せずに、for文のコードを読んでデバッグするか、後述するデバッガを使います。
2. 条件式をよく確認する
for文で無限ループが発生する原因は、条件式がいつまでも「偽」にならないことにあります。
以下のようにどれだけ繰り返しても条件式が「真」のままの場合は、無限にループします。
for (let i = 0; i >= 0; i++) {
console.log(i);
}
変数iを加算し続けた場合に、条件式が「偽」になるかどうかを確認しましょう。
3. 変化式をよく確認する
条件式に問題がない場合、変化式に原因がある可能性があります。
たとえば、以下の場合、初期化式と条件式は普通に見えますが、変化式に問題があるため無限ループが発生します。
for (let i = 0; i < 100; i--) {
console.log(i);
}
変数iがずっと減算され、100以上にならないため、無限ループになります。
変化式にこのような問題がないことを確認しましょう。
4. デバッガを使う
コードを読んでも問題の原因を見つけられない場合は、デバッガを使ってみましょう。
デバッガを使用すれば、for文の中にブレークポイントを設定して、一時停止しながら処理を追うことができます。
処理を落とすことなく変数の状態を確認できるため、コードのどこに問題があるかを特定しやすくなります。
2. 配列の範囲外アクセス(TypeError: Cannot read property XXX of undefined)
for文で配列を処理するとき、配列の範囲外にアクセスしようとして「範囲外アクセス」のエラーが発生することがあります。
たとえば、以下のような場合、配列の範囲外へのアクセスが発生します。
const array = [
{"name": "chocolate", "price": 100},
{"name": "cookie", "price": 50},
{"name": "cake", "price": 200},
];
for (let i = 0; i <= array.length; i++) {
console.log(array[i]);
let name = array[i].name; // ここでエラーが発生する
console.log(name);
}
// {"name": "chocolate", "price": 100}
// chocolate
// {"name": "cookie", "price": 50}
// cookie
// {"name": "cake", "price": 200}
// cake
// undefined
// TypeError: Cannot read properties of undefined (reading 'name')
このコードでエラーが発生する理由は、条件式が「i <= array.length;」になっているためです。
いま配列の長さ(array.length)は3です。
条件式が「i <= array.length;」なので、変数iは0, 1, 2, 3と増えます(4回のforループ)。
配列の長さが3であるのに対し、for文の繰り返し回数が4回になっているため、最後のループでの出力が「undefined(未定義)」になります。
これが配列の範囲外アクセスです。
undefinedは、属性「name」を持たないのでTypeErrorが発生します。
上記のコードを正しく修正したものは、以下です。
const array = [
{"name": "chocolate", "price": 100},
{"name": "cookie", "price": 50},
{"name": "cake", "price": 200},
];
for (let i = 0; i < array.length; i++) {
console.log(array[i]);
let name = array[i].name;
console.log(name);
}
「配列の範囲外アクセス」のデバッグ方法
配列の範囲外へのアクセスが発生したときのデバッグ方法は以下です。
- エラーメッセージを確認する
- forループで取得している要素の中身を確認する
- 条件式を確認する
- 配列の要素数を確認する
- デバッガを使う
1. エラーメッセージを確認する
配列の範囲外へアクセスした場合、エラーメッセージが表示されます。エラーメッセージをよく読み、エラーが発生した行を調べましょう。
配列の範囲外へのアクセスが原因で発生するエラーとしては「undefined」や「null」などのオブジェクトの属性(attribute)を取得しようとして発生する「TypeError」や「AttributeError」が多いです。
また「IndexOutOfBoundsException(インデックス範囲外の例外)」のように、範囲外にアクセスしていることが、エラーメッセージに直接的に書かれていることもあります。
まずは、エラーメッセージをきちんと読みましょう。
2. forループで取得した要素の中身を出力
forループで取得した要素の中身を、コンソールに出力してみましょう。
エラーメッセージが出ている場合も、出ていない場合も、forループで取得した要素の中身を出力するとバグの原因に気付くことがあります(後述するデバッガを使っても構いません)。
console.logや、printなどの標準出力関数を使用して、取得した要素がundefinedやnullになっていないことを確認しましょう。
const array = ["A", "B", "C"]
for (let i = 0; i <= array.length; i++) {
console.log(array[i]); // ← 処理中の要素をログ出力する
}
// A
// B
// C
// undefined ←範囲外にアクセスしているのでundefinedが出ている
処理の前後でundefinedやnullが出ている場合は、配列の範囲外にアクセスしている可能性があります。
3. 条件式を確認する
条件式を確認しましょう。
配列の範囲外アクセスが発生するのは、変数iが配列の範囲を超えてしまうためです。
条件式の比較演算子(「<=」や「<」など)が適切に設定されているかを確認します。
4. 配列の要素数を確認する
配列の要素数も確認しましょう。
for文の繰り返し回数が要素数を超えている場合、範囲外アクセスが発生する可能性が高いです。
for文の繰り返し回数をカウントして、要素数と比較してもいいです。
これらの数に違いがないか確認しましょう。
const array = ["A", "B", "C"]
console.log("要素数:" + array.length);
count = 0
for (let i = 0; i <= array.length; i++) {
count++; // 繰り返し回数をカウントする
}
console.log("繰り返し回数" + count);
// 要素数:3
// 繰り返し回数4
// → 繰り返し回数と要素数が異なる。for文の書き方が間違っている可能性があると予測できる
5. デバッガを使う
コードを読んで確認しても問題が見当たらない場合は、デバッガを使ってみましょう。
デバッガを使用すれば、for文の中にブレークポイントを設定して、一時停止しながら変数の状態を追うことができます。
これによって、どこで予期しない動作が起きているかを特定しやすくなります。
3. スコープ外での変数の使用(ReferenceError: XXX is not defined)
for文の内側の変数に、外側からアクセスしようとしてエラーが出ることがあります。
for (let i = 0; i < 10; i++) {
console.log(i);
}
console.log(i); // ReferenceError: i is not defined
言語にもよりますが、for文の内側で宣言した変数は、for文の内側でしかアクセスできません。
このように、ある変数を参照できる範囲のことを「スコープ」といいます。
for文の内側で宣言した変数は、for文のスコープでしか使えないため、for文の外(スコープ外)から参照しようとすると「ReferenceError(参照エラー)」が発生します。
上記のコードで、for文の外側でも変数iを使いたい場合、次のようにfor文の外で宣言する必要があります。
let i = 0; // 変数iをfor文のスコープの外側で宣言する
for (i = 0; i < 10; i++) {
console.log(i)
}
console.log("スコープ外: i = " + i); // スコープ外: i = 10
「スコープ外での変数の使用」のデバッグ方法
スコープ外の変数の使用をデバッグするには、次のようにします。
- エラーメッセージを確認する
- 変数宣言の位置を確認する
- デバッガを使用する
1. エラーメッセージを確認する
まずはエラーメッセージを確認します。
スコープ外の変数を参照した場合「ReferenceError」や「NameError」など、変数の参照についてのエラーメッセージが表示されます。
この内容を確認して、どこでどの変数の参照ができていないのかを確認しましょう。
2. 変数宣言の位置を確認する
エラーが出ている変数を特定できたら、その変数を宣言している位置を確認します。
変数を宣言した位置がfor文のスコープの内側にあるのか外側にあるのかが重要です。
for文のスコープ内で宣言している変数をスコープ外で使うことはできません。
for文の中で使っている変数を、for文の外でも使いたい場合は、あらかじめfor文の外で宣言する必要があります。
3. デバッガを使用する
コードを読んでも問題の原因を見つけられない場合は、デバッガを使いましょう。
デバッガを使用すれば、エラーの原因となっている変数の状態をステップ・バイ・ステップで追うことができます。
for文の最適化
繰り返し処理には時間がかかる場合があります。
大きなデータを扱う場合や、処理速度が重要なシステムの開発では、for文の最適化を求められることがあります。
言語によっては、for文の書き方の工夫で処理速度を改善できることがあります。
たとえば、JavaScriptのfor文で配列を処理する場合 for (let i; i < array.length; i++) {}
で処理するか、for (let element of array){}
で処理するかによって処理速度が異なります。
const array = [...Array(1000000).keys()];
for (let i = 0; i < array.length; i++) {
let element = array[i];
}
const array = [...Array(1000000).keys()];
for (let e of array) {
let element = e;
}
これら2つを比較すると、2023年3月現在では、単純なfor文(変数iを使う方法)が速いという報告されています。
処理速度は実行環境にもよりますが、単純なfor文のために最適化されている環境が多いことがその理由と考えられます。
他にも、同じ処理をforEachやwhileで書き換えたほうが高速になる場合もあります。
繰り返し処理を高速化することを求められた場合は、言語の仕様や実行環境について調べ、処理に最適な繰り返し処理を選択しましょう。
for文以外の繰り返し処理
for文以外の繰り返し処理として、while文や関数型の反復処理(forEach、mapなど)があります。
1. while文
while文は多くの言語にも実装されている繰り返し処理の構文です。
以下のように書きます。
while (条件式) {
// 任意の処理
}
for文に比べ、while文はシンプルに書くことができます。
ただし、初期化式や変化式をwhile文とは別に書く必要があります。
たとえば、while文を使って0から9までの整数を出力するには次のようにします。
let i = 1;
while (i <= 10) {
console.log(i);
i++;
}
また、while文で配列を処理するには次にようにします。
const array = ["A", "B", "C"];
let i = 0;
while (i < array.length) {
console.log(array[i]);
i++;
}
while文では、while文の内側に「i++」というインクリメント処理を書きます。
これを忘れると、条件式が永久に「真」のままになり、無限ループが発生します。
インクリメントを書き忘れるリスクが高いため、プロのエンジニアが働く現場では、あまりwhile文を見かけません。
同じ処理をfor文でも書ける場合はfor文で書くほうが無難です。
2. 関数型の反復処理
配列を処理する際に array.forEach()
のような記述で繰り返し処理を書ける言語もあります。
たとえば、JavaScriptでは、forEachメソッドを使って次のように配列を処理することができます。
配列.forEach(
(要素) => {
// 要素に対する任意の処理
}
);
たとえば、以下のように使います。
const array = ["A", "B", "C"];
array.forEach(
(element) => { console.log(element); }
);
forEachメソッドには、引数として匿名関数(名前をつけない関数)を渡すことができます。
上記の例では、arrayの要素が、forEachの引数に書かれた匿名関数の引数「element」に渡されます。
そして、その後の波カッコ({})内の処理で、配列の要素「element」にアクセスできます。
このように、forEachのような関数型の反復処理を使うと、条件式や変化式を書く必要がなく、シンプルに繰り返し処理を実行できる場合があります。
【言語別】for文の書き方
ここでは言語別のfor文の書き方を紹介します。
1. C言語
C言語のfor文はシンプルです。
「初期化式」「条件式」「変化式」を用いて変数を変化させながら繰り返し処理をします。
for文
C言語では変数iを型をつけて宣言する必要があります。
for (int i = 0; i < 10; i++) {
printf("%d\n", i);
}
配列処理
C言語で配列を処理するときは、変数を使って配列の要素にアクセスします。
int array[] = {1, 2, 3, 4, 5};
int length = sizeof(array) / sizeof(int);
for (int i = 0; i < length; i++) {
printf("%d\n", array[i]);
}
2. Python
Pythonのfor文は、他の言語と少し異なります。
for文
Pythonでは「条件式」や「変化式」を用いません。
range関数を用いて、繰り返し回数を指定して反復させます。
また、for … in という形をとります。
for i in range(10):
print(i)
配列処理
Pythonで配列処理をするのは、とても簡単です。
for … in の形で配列の要素に順にアクセスできます。
array = [1, 2, 3, 4, 5]
for element in array:
print(element)
3. JavaScript
JavaScriptのfor文はシンプルです。
for文
JavaScriptのfor文では、初期化式、条件式、変化式を設定してループします。
for (let i = 0; i < 10; i++) {
console.log(i);
}
配列処理
JavaScriptの配列処理では、変数iを使って配列の要素にアクセスするかfor … ofを用いるのが一般的です。
const array = [1, 2, 3, 4, 5];
for (let i = 0; i < array.length; i++) {
console.log(array[i]);
}
for … ofを使ったほうがコードが簡潔になります。
const array = [1, 2, 3, 4, 5];
for (let element of array) {
console.log(element);
}
4. Ruby
Rubyのfor文は、他の言語と少し異なります。
for文
Rubyのfor文は「for … in do」という形をとります。
for i in 1..10 do
puts(i)
end
配列処理
Rubyで配列処理をするには、for…inを使うのが一般的です。
for element in [1, 2, 3, 4, 5]
puts(element)
end
5. PHP
PHPのfor文はシンプルです。
for文
PHPのfor文では「初期化式」「条件式」「変化式」を指定して繰り返し処理をします。
for ($i = 0; $i < 10; $i++) {
echo $i;
}
配列処理
PHPの配列処理では、foreach … asが使えます。
$arr = array(1, 2, 3, 4, 5);
foreach ($arr as $element) {
echo $element;
}
JavaScriptのfor … ofや、Pythonのfor … inと異なり for(配列 as 要素名
) となる点に注意しましょう。
6. Java
Javaのfor文はシンプルです。
for文
変数iの宣言時に型名intを明示する必要があります。
for (int i = 0; i < 10; i++){
System.out.println(i);
}
配列処理
Javaで配列処理をするには、拡張forが使えます。
for (型 要素名: 配列) {}
という形で配列を処理できます。
int array[] = {1, 2, 3, 4, 5};
for (int element: array){
System.out.println(element);
}
7. C#
C#のfor文はオーソドックスな形です。
for文
基本通りのfor文です。
for (int i = 0; i < 10; i++) {
System.Console.WriteLine(i);
}
配列処理
C#で配列を処理するにはforeach文が使えます。
int[] array = { 1, 2, 3, 4, 5 };
foreach (int i in array)
{
System.Console.Write(i);
}
まとめ
この記事では、プログラミングのfor文について解説しました。
- for文は繰り返し処理に使用します
- 一般的なfor文では「初期化式」「条件式」「変化式」の3要素で条件を設定します
- for文は入れ子にしたり、if文と組み合わせて使うこともできます
- 配列の処理にもfor文を使うことができます
- for文の他にwhile文や関数型の反復処理を用いて繰り返し処理ができます
for文はif文と同様、プログラミングに必須の制御構文のひとつです。
よく理解してマスターしましょう。
コメント