[過去ログ] 【3Dゲームエンジン】Unity質問スレッド32 (1002レス)
上下前次1-新
抽出解除 必死チェッカー(本家) (べ) 自ID レス栞 あぼーん
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
391: 2017/11/25(土)19:39 ID:tNOe2BPS(1/9) AAS
「キムチ君、制作物は細かい所手抜きなのに言葉は潔癖かよ!」と思いながらROMってる皆さんこんばんは。
講義のお時間です。
今回も"条件分岐"についての講義です。
前回は「if文」を使いました。
今回はもう一つの条件分岐文である「switch文」をやります。
394: 2017/11/25(土)19:57 ID:tNOe2BPS(2/9) AAS
前回、"if(){ } else if(){ }"の説明で下のような例を出しました
例
if( a == 1 ){
Debug.Log("aは1");
} else if( a == 2 ){
Debug.Log("aは2");
} else if( a == 3 ){
Debug.Log("aは3");
} else {
Debug.Log("aは1でも2でも3でもない");
}
"switch文"を使用するとこれを下のように書けます。
実行結果はif文でもswitch文でも両方同じです。
例
switch( a ){
case 1:
Debug.Log("aは1");
break;
case 2:
Debug.Log("aは2");
break;
case 3:
Debug.Log("aは3");
break;
default:
Debug.Log("aは1でも2でも3でもない");
break;
}
397: 2017/11/25(土)20:05 ID:tNOe2BPS(3/9) AAS
見て分かる通りswitch文で出来る事はif文でも可能です。
そのせいでswitchって使い所がイマイチわからないという初心者が多いです。
switch文はif文の簡易バージョンと思ってください。
「switch( a >= 1 )」とか
「switch( a == 1 )」とか
「switch( a == 1 && b == 1)」とか
if文並みの複雑な条件式は記述できません(エラーになります)
『1つの変数の値の変化で実行させたいプログラムを変えたい時に使う』物です。
複雑な条件分岐はIF文に任せましょう。
ちなみに先程の例では「if else if文」側より「switch文」側の方が多少処理速度が速いです。
早いと言っても0.0001秒という微々たる差ですが。
398: 2017/11/25(土)20:17 ID:tNOe2BPS(4/9) AAS
"default:"は"case"のどれにも一致しなかった場合に実行される部分です。
if文のelseに相当します。
if文でelseを書かない事が出来たように不要ならば"default:"も書かなくて大丈夫です。
例
switch( a ){
case 1:
Debug.Log("aは1");
break;
case 2:
Debug.Log("aは2");
break;
}
"case"は「変数がその値だったら」という意味合いで記述します。
上の例ですと
"case 1:"は"if( a == 1 )"と同じで"case 2:"は"if( a == 2 )"と同じです。
もう少し分かりやすくすると下のようになります。
例
string mode = "OPENING";
switch( mode ){
case "OPENING":
Debug.Log("オープニングだよ");
break;
case "ENDING":
Debug.Log("エンディングだよ");
break;
}
上の場合「オープニングだよ」と表示されます。
変数"mode"の中身を例えば"hello"と適当な文字に変えるとどれにも一致しなくなるため何も表示されなくなりなります。これは"default:"を記述していないからです。
399: 2017/11/25(土)20:25 ID:tNOe2BPS(5/9) AAS
"break;"は重要です。
下に"case 1:"の"break;"を削除した例を書きます。
例
switch( a ){
case 1:
Debug.Log("aは1");
case 2:
Debug.Log("aは2");
break;
}
この場合"a"の中身が1の時に「aは1」と「aは2」両方表示されます。
"break;"を付けないと処理が止まらず次の"case"も実行される仕組みです。
この特性を生かし「aの中身が1か2の時に実行させたい」などの変わった使い方もできます。
例
switch( a ){
case 1:
case 2:
Debug.Log("aは1か2");
break;
}
当然ですが「switchの中にさらにswitch」、「switchの中にif文」なども可能です。
ただし見づらくなるのであまり多少はしない方がいいでしょう
400(1): 2017/11/25(土)20:27 ID:tNOe2BPS(6/9) AAS
<switch文の中にさらにswitch文の例>
int a = 1, b = 1;
switch( a ){
case 1:
switch( b ){
case 1:
Debug.Log("aは1でさらにbは1");
case 2:
Debug.Log("aは2");
break;
}
この場合"a"の中身が1の時に「aは1」と「aは2」両方表示されます。
"break;"を付けないと処理が止まらず次の"case"も実行される仕組みです。
この特性を生かし「aの中身が1か2の時に実行させたい」などの変わった使い方もできます。
例
switch( a ){
case 1:
case 2:
Debug.Log("aは1か2");
break;
}
当然ですが「switchの中にさらにswitch」、「switchの中にif文」なども可能です。
ただし見づらくなるのであまり多少はしない方がいいでしょう
401: 2017/11/25(土)20:28 ID:tNOe2BPS(7/9) AAS
これは書き途中で送信したミス投稿なので無視するように>>400
402(1): 2017/11/25(土)20:32 ID:tNOe2BPS(8/9) AAS
<switch文の中にさらにswitch文の例>
int a = 1, b = 1;
switch( a ){
case 1:
switch( b ){
case 1:
Debug.Log("aは1でさらにbは1");
break;
case 2:
Debug.Log("aは1でさらにbは2");
break;
}
case 2:
Debug.Log("aは2");
break;
}
<switch文の中にさらにif文の例>
int a = 1, b = 1;
switch( a ){
case 1:
if( b == 1 ){
Debug.Log("aは1でさらにbは1");
} else if( b == 2 ){
Debug.Log("aは1でさらにbは2");
}
break;
case 2:
Debug.Log("aは2");
break;
}
403(1): 2017/11/25(土)20:37 ID:tNOe2BPS(9/9) AAS
複雑になってきましたね
実は>>402の
「<switch文の中にさらにswitch文の例>」には"break;"が1つ抜けており
「a = 1」の時の結果が正しくならないバグを今見つけました。
このように見づらい&ミスをしやすくなるため
switch文の中にさらにswitch文を入れる事はあまり良い方法とはいえず推奨はされていません。
以上だクソども
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ
ぬこの手 ぬこTOP 0.025s