C言語のfor文の便利な使い方について
18/11/25 16:35:32 19/05/05 15:22:59
for文は繰り返し処理の基本ロジックで、繰り返し処理はプログラミングにおいて条件分岐と並ぶ基本アルゴリズムです。繰り返し処理を自動化できるからこそプログラミングのメリットがあると言っても過言ではないでしょう。
人間が手動で何度も同じことをやるのは大変な場合、繰り返し処理を実装すればコンピューターが勝手に処理してくれます。そのため、for文はプログラミング学習者が最優先で習得したいアルゴリズムです。
変数やクラスの宣言等ももちろん最初に学びますが、アルゴリズムに関してはfor文が最初かもしれません。またfor文はほとんどのプログラミング言語使用されるコードなので、C言語で勉強しておけば言語が変わってもすぐに対応できます。
プログラミングにある程度慣れている人であれば、まったく知らない言語のソースコードを見てもfor文の処理内容は把握できるくらいです。またfor文に限った話ではありませんが、C言語をベースにプログラミングを学習するのは良いかと思います。
なぜなら、最近のプログラミング言語の比べてC言語は記述が簡略化されていないからです。C言語を先に学習すれば、他のプログラミング言語では理解した上で記述を簡略化することができます。
それでは、C言語のfor文について解説します。今回紹介する内容は少し応用編ですが、for文が初めての方でも理解できるよう丁寧に説明していきます。
目次
二重ループの書き方
まずは二重ループのサンプルコードです。
#include <stdio.h>
int main(void) {
for(int i = 0; i < 3; i++) {
for(int j = 0; j < 3; j++) {
printf("i:%d,j:%d\n", i + 1, j + 1);
}
}
return 0;
}
上記のソースコードを実行すると、以下のようにコンソール出力されます。
i:1,j:1
i:1,j:2
i:1,j:3
i:2,j:1
i:2,j:2
i:2,j:3
i:3,j:1
i:3,j:2
i:3,j:3
for文の構成は、(初期値;継続条件;インクリメント(増えていく)数)となっています。直感的にわかりやすいかと思います。
上の例だと初期値0から始まって、iが3になったタイミングでループを抜けます。インクリメントは「++」なのでiが1づつ増えていきます。二重目のjのfor文についても同様です。
次にループの内容ですが、iのループに入った直後にjのループに入り、jのループで初期値の0からj<3の条件を満たさなくなるまでjを加算していきます。そのため、iの値を変えないままjのループが3回回っています。
jが3回回ったら処理を抜けて、iに加算します。再びjのループに入り、3回回ります。3回回ったらまたjのループを抜けてiを加算します。このように、iのループのなかでjのループの処理が実行されるわけです。
理屈的には二重でなくても無限にfor文をネストさせていくことができるのですが、ネストし過ぎるとコードが見にくくなります。実際のシステム開発現場では、ネストは階層まで、といった規約が設けられている場合が多いでしょう。
無限ループの使い方
無限ループの書き方は簡単で、以下のようになります。
for (; ; ) {
//処理内容
}
for文の構成は上で説明した通り、初期値、継続条件、インクリメント、となっていますが、何も指定しないとループは無限に続きます。実際のサンプルコードは以下です。
#include <stdio.h>
int main(void) {
for(; ; ) {
}
printf("無限ループ\n");
return 0;
}
上記のソースコードを実行すると、以下のようにコンソール出力されます。
無限ループ
無限ループ
無限ループ
無限ループ
・
・
・
・
・
・
・
このように、「無限ループ」という出力が無限に続きます。次に、以下のように記述すれば無限ループ処理のなかでもループを抜けることができます。
#include <stdio.h>
int main(void) {
int i = 0;
for(; ; ) {
i++;
if(i > 3) {
break;
}
printf("%d回目の処理\n", i);
}
printf("処理終了\n");
return 0;
}
上記のソースコードを実行すると、以下のようにコンソール出力されます。
1回目の処理
2回目の処理
3回目の処理
処理終了
for文は無限ループするように書いているのですが、中でiが3になったタイミングでbreakするように記述しています。
上記のコードだとfor文を無限ループにして中の条件文でbreakさせる理由が不明なのですが、たとえば特定の条件に合致したときのみbreakさせているような無限ループロジックは実際のシステムでも存在します。
continueで処理を飛ばす
breakだとループを抜けてしまうのですが、ループは抜けずに、条件に合致する間だけ処理を飛ばしたい場合もあるでしょう。そんなとき役立つのがcontinueです。continueを使ったサンプルコードは以下です。
#include <stdio.h>
int main(void) {
for(int i = 0; i < 5; i++) {
if(i + 1 < 3) {
continue;
}
printf("%d回目の処理\n", i + 1);
}
printf("処理終了\n");
return 0;
}
3回目の処理
4回目の処理
5回目の処理
処理終了
if文の条件に当てはまる間はcontinue句によって以降の処理が飛ばされています。そして、if文の条件に当てはまらなくなった3回目以降の処理は出力されています。
while文でのループ処理
ループ処理はfor文だけでなく、while文で記載することも可能です。具体的には以下のようになります。
#include <stdio.h>
int main(void) {
int i = 0;
while(i < 3) {
printf("%d回目の処理\n", i + 1);
i++;
}
printf("処理終了\n");
return 0;
}
上記のソースコードを実行すると、以下のようにコンソール出力されます。
1回目の処理
2回目の処理
3回目の処理
処理終了
for文と違ってwhile文では継続、終了条件のみの記載となります。そのため、while文の前に初期値を設定し、while文のなかでインクリメント処理を行っています。状況にもよりますが、for文を使用した方が処理の記載がすっきりする場合が多いです。
for文で配列に処理を行う
配列はfor文との相性が良く、このセットで使用されることは多いです。サンプルコードを紹介します。
#include <stdio.h>
int main(void) {
int array [5] = {0, 1, 2, 3, 4};
for(int i = 0; i < 5; i++) {
printf("%d,", array [i]);
}
return 0;
}
上記のソースコードを実行すると、以下のようにコンソール出力されます。
0,1,2,3,4
配列に5つの数字が入っていますが、for文を使用してすべて出力しました。ちなみに、継続条件を1<5としていますが、配列長さを取得する関数を使うケースが多いです。
上記のサンプルコードでは要素の出力を行っていますが、要素の書き換え、ループのなかで判定を行って条件に合致するもののに書き換える、といった処理を行うことも可能です。
他にもfor文のなかではいろいろな処理を実行することができますが、それについては徐々にレパートリーを増やしていくと良いかと思います。
案件量が豊富なアルマサーチ
最後に、アルマサーチのご紹介!
アルマサーチはフリーランス向けに案件をご紹介することに特化したエージェントサービスです。豊富な案件量から、安定して継続的な案件のご紹介を実現しており、口コミから登録エンジニアが急増中です。
アルマサーチが選ばれる理由
- 豊富な案件量。週3?4日の案件や在宅リモート案件も。
- 優秀なコンサルタント陣。
- 案件に参画後もしっかりサポート。
豊富な案件量
フリーランス向けに特化し、業界屈指の案件量を誇ります!週3?4日の案件や、在宅リモート案件もありますし、その他あらゆる希望をしっかりお伝えください。最適な案件のご紹介をさせていただきます。
優秀なコンサルタント陣
技術に疎く、開発の希望を伝えても響かないエージェント・・・嫌ですよね。アルマサーチにはそのような者は一切おりません!さらに独立にまつわる税金や保険関係に詳しいスタッフが徹底的にサポートさせていただきます。
案件に参画後もしっかりサポート
常駐先が決まった瞬間に、一度も連絡が取れなくなるエージェント・・・いますよね?アルマサーチでは、そのようなことは一切ありません!常に電話やメールは即対応しますし、月に1度のランチミーティングなどから現場の状況を細かくヒアリングし、就業環境改善に尽力いたします。
人気記事