今回はC#でFor文、ForEach文、While文、Do-While文を使った繰り返し処理をやってみたいと思います。
サンプルはUnity付属のMonoDevelopを使って確認していきます。
繰り返し文は条件が成立している間は処理を繰り返す事が出来るので、配列やリストの要素を操作する時に便利ですね。
For文、ForEach文、While文、Do-While文はほとんど同じ処理ですが、個人的な利用の仕方としては、
- For文は回数を限定した繰り返しをしたい時。
- ForEach文は配列やコレクションクラスの要素数だけ繰り返したい時。
- Whileは無限ループ中で何らかの処理をさせ、条件をfalseするかbreakをして抜けたい時。
- Do-Whileはループを必ず1回は実行したい時。
としていますが、For、While、Do-While間では相互に書き換えが可能なので、大きな違いはありません。
それでは一つ一つ見ていきましょう。
For文
For文は繰り返し変数である初期化子、繰り返しの条件、繰り返し変数の書き換えである反復子を設定します。
1 2 3 4 5 | for (初期化子; 条件; 反復子) { // 繰り返す処理 } |
↑のような感じになります。
例えば1から10までの数値を全て足す処理を記述する時は、
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | using UnityEngine; using System.Collections; public class Learn5_1 : MonoBehaviour { // Use this for initialization void Start () { int sum = 0; for (int i = 0; i < 10; i++) { sum += i + 1; } Debug.Log ("1から10までを足した合計 " + sum); } } |
↑のように記述します。
繰り返し変数は通常iを設定し、For文のネストをする時はi,j,k…と変数名を変更していきます。
ただの慣習なのでaなどの別の変数名を使う事も出来ます。
今回の場合はiで宣言し0で初期化しています。
;の後に繰り返し条件を設定します。
繰り返し条件はiが10より下の間という条件になります。
;の後に繰り返し変数の書き換えを行います。
今回はi++で1回処理が終わったらiの値に1を足しています。
iは0で初期化しているので、1から10までの数値を足すにはsumにi+1をした数値を足す必要があります。
For文を使い始めの時は実行順序がわからなくなりますが、実行順序を並べると、
- iを0で初期化
- i<10の条件をクリアしている
- sum += i + 1を実行
- i++でiが1になる
- i<10の条件をクリアしている
- sum += i + 1を実行
をi<10の条件が成立する間繰り返します。
i++でiが10になった時、条件であるi<10が成立しなくなる為、For文を抜けてDebug.Logで足した数を出力します。
初期化子は最初の1回しか実行されないということになりますね。
初期化子と反復子は,を使って複数指定する事が出来、条件には&&や||で複数の条件を組み合わせる事が出来ます。
1 2 3 4 5 | for (int i = 0, j = 0; i < 10 || j < 10; i++, j += 2) { Debug.Log(i + " : " + j); } |
↑の例ではiとjを0で初期化し、条件ではiかjが10より下の時に繰り返すようにします。
反復子ではjは2づつ増えるようにしています。
これを実行すると
↑のようになります。
jは途中で10を超えますが、iが10を超えるまでは実行されています。
For文で初期化子、条件、反復子を記述しなければ無限ループとなります。
1 2 3 4 5 6 7 8 9 10 11 | // Forで無限ループ int sum = 0; for (;;) { sum++; if (sum > 10) { break; } } |
↑の例ではFor文の初期化子、条件、反復子が設定されていない為、無限に処理を実行します。
For文内でsumの値を足していき、10を超えたらbreakでFor文を抜けるようにしています。
breakについては後でやります。
For文やWhile文で条件が成立しないようにすると無限に処理を実行してしまう為、フリーズしてしまいます。
その為、For文やWhile文の処理の中でループを抜ける処理を記述しておく必要があります。
ForEach文
ForEach文は配列やリスト等のコレクションを操作する時に便利な繰り返し処理が出来ます。
1 2 3 4 5 | foreach (var 一時変数 in 配列やコレクションの変数) { // 繰り返し処理 } |
↑のように配列やコレクションの変数を指定すればその要素数分繰り返し処理が行われ、その要素は一時変数に代入されます。
varは暗黙の型指定で、配列やコレクションは型が決まっている為、通常は型指定せずvarを使います。
例えば配列がint型の配列であればvarの部分をintとして実行する事も可能ですが、それぞれの型に合わせて変更するのは面倒だと思うのでvarでいいと思います。
それでは、配列やリストを作成し、それらをForEachで使用してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | using UnityEngine; using System.Collections; using System.Collections.Generic; public class Learn5_2 : MonoBehaviour { // Use this for initialization void Start () { int[] intValues = new int[] { 1, 2, 3, 4, 5 }; string[] stringValues = new string[] { "test1", "test2", "test3", "test4" }; List<float> floatList = new List<float> { 1.0f, 2.0f, 3.5f, 4.5f }; int intSum = 0; float floatSum = 0f; // intValuesの合計値を計算 foreach (var value in intValues) { intSum += value; } Debug.Log ("intValuesの合計 " + intSum); // stringValuesの文字列を全て表示 foreach (var value in stringValues) { Debug.Log (value); } // floatValuesの合計値を計算 foreach (var value in floatList) { floatSum += value; } Debug.Log ("floatListの合計値 " + floatSum); } } |
int型の配列intValues、string型の配列stringValues、float型を入れるリストのfloatListを宣言し、
intValues、floatValuesは要素の合計、stringValuesは要素を表示しています。
実行すると、
↑のようになりました。
While文、Do‐While文
while、Do-Whileは条件が成立する間繰り返す処理で、違いはWhileは1回も実行しない可能性があり、Do-Whileは1回は必ず実行するという違いがあります。
Whileの書き方は
1 2 3 4 5 | while (条件式) { // 実行する処理 } |
↑のようになります。
Do-Whileは
1 2 3 4 5 | do { // 実行する処理 } while (条件式); |
↑のようになり処理を必ず1回実行してから条件を判定します。
それでは実際に使ってみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | using UnityEngine; using System.Collections; public class Learn5_3 : MonoBehaviour { // Use this for initialization void Start () { int sum = 0; // sumが20より下の間繰り返す while (sum < 20) { sum++; } Debug.Log ("whileの実行終了"); sum = 0; // do-while文 do { sum++; } while (sum < 20); Debug.Log ("do-whileの実行終了"); } } |
Whileではsumが20より下の間は繰り返しsumに1を足して、条件に合わなくなったらループを抜け出しています。
Do-Whileでも同様の処理をしています。
繰り返し文で使用するキーワード
繰り返し文の中で使用するキーワードについてみていきましょう。
breakキーワード
繰り返し文では何らかの条件でループを抜け出しますが、条件式で指定した以外で抜け出したい事もあります。
そんな時に使用するのがbreakキーワードです。
breakキーワードを指定するとその場でループを抜け出す事が出来ます。
1 2 3 4 5 6 7 8 9 10 11 | // sumが20を越えたらループを抜ける int sum = 0; while (true) { sum++; if (sum > 20) { break; } } Debug.Log ("breakの実験終了"); |
↑の例ではWhileの条件式にtrueを指定し無限ループにします。
sumの値に1を足していって、20を超えたらbreakキーワードを使ってwhileを抜け出しています。
continueキーワード
continueキーワードは繰り返し文の中で登場すると、その後の処理をせずループの最初に実行を移します。
ある一定の条件の時だけ実行したい処理があった場合はcontinueを使ってその後の処理を飛ばす事が出来ます。
1 2 3 4 5 6 7 8 9 10 | // 奇数値の時だけ表示 for (int i = 0; i < 10; i++) { if (i % 2 == 0) { continue; } Debug.Log (i); } Debug.Log ("continueの実験終了"); |
↑の例では奇数値だけをコンソールに表示するようにしています。
個人的にはbreakはよく使いますが、continueはあまり使っていません。
終わりに
繰り返し文はループの条件を誤ると無限ループに陥ってしまう事がありますが、それさえ気を付ければ非常に便利なものですね。
繰り返し文を段々使えるようになると、プログラミングをしている!という感じがしてうれしかったものです(^^)/
いまだに無限ループを発生させてしまって、Unityを落としてしまう事もありますが・・・(^_^;)