プログラム超初心者メモ ループ系サンプルコード (Switch文の復習を兼ねて)

ループ系サンプルコード (Switch文の復習を兼ねて)

https://unity3d.com/jp/learn/tutorials/topics/scripting/loops

このリンクを見て改めて・・・なんとなく、最初に学んだのが
forだったからか、forが好き。
基本、1行でいろいろ定義できる。
配列を使う場合に、配列のLengthが、実際の要素数より1多い事に注意が必要。
10個の要素があっても0番から始まるので、当然だが・・・
そういう問題点はあると思うが、基本自由度が高い印象。

foreach は簡潔に書けるが汎用性が低そう。
配列系を全部なめるときは良さそう。
もっと使っていいと思うが、現状はなんでもfor文になってるかも・・・

whileは、とても使いやすそうに見えるが・・・
とりあえず試し書きしながらというのが今の環境だと難しい。
コンパイルエラーがでなくても、Unityがプレヴュー実行可能で、脱出条件を書き忘れると
無限ループになって固まってしまうので慣れないと使いにくい。
その問題がなければ使いやすそうだが、現環境では学習効率上、致命的な欠点なので・・・
なので躊躇して書かないから、一年後も書けるようにならない気がする。

以下テストコード丸ごと
※ Unity Mac VScode 利用でのテスト用
 てきとうなゲームオブジェクトにこのコードを貼り付けてインスペクタで
 ループモードを変えれば、プリント内容が変わります。


using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Foreach_For_While : MonoBehaviour {

 private int[] IntArray ={0,11,222,3333,44444,555555};
 public enum LoopMode {Foreach,For,While,Stop};
 public LoopMode MyLoopMode;

    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update () {
        switch(MyLoopMode)
        {
            case LoopMode.Foreach:
                // int count=0;
                // ▲ Switch文はif文と違ってスコープが別れていないので、同名のローカル変数を作りにくい?
                // ▼ ・・・と思ったけどスコープの外に書いているからダメだったのがアドバイスで解りました。
                {
                    int count=0;
                    foreach(int num in IntArray)
                    {
                        print("foreach__"+num.ToString());
                        count++;
                        if(count==IntArray.Length){MyLoopMode=LoopMode.Stop;}
                    }
                    break;
                }
            case LoopMode.For:
                int maxF=IntArray.Length-1; 
                for(int i=0;i<=maxF;i++)
                {
                    print("for__"+IntArray[i].ToString());
                    if(i==maxF){MyLoopMode=LoopMode.Stop;}
                }
                break;
            case LoopMode.While:
                int countW=0,maxW=5;
                //while(int id < IntArray.Length)
                //     ↑ と 型を書いて定義することはできないっぽい。
                //ちょっとしたミスで、無限ループになる可能性がそこそこある…Unityが固まる。
                while( countW <= maxW)
                {
                     print("while__"+IntArray[countW].ToString());
                     if(countW==maxW){MyLoopMode=LoopMode.Stop;}
                     countW++;
                }
                break;
            case LoopMode.Stop:
                break;
        }
    }
}
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.