switchステートメントの、面白い小技をご紹介します。
↓↓ まずは下のコードを見てください。↓↓switch (n) {
case 0:
// ★A
case 1:
// ★B
case 2:
// ★C
// ★D
case 3:
// ★E
break;
default:
// ★F
break;
}
(何だか★がいっぱいあって落ち着かないですが、そこはご愛嬌 ^^;)
このコードでは、
n == 0 の場合、★A ⇒ ★B ⇒ ★C ⇒ ★D ⇒ ★E と順に処理が実行されます。
また、
n == 1 の場合、★B ⇒ ★C ⇒ ★D ⇒ ★E と順に実行されます。
n == 2の場合は ★C ⇒ ★D ⇒ ★E と実行され、
n == 3 の場合は、★Eのみが実行されます。
そして、
n が 0,1,2,3 以外の場合(default)は、★Fのみが実行されます。
・・・と、ここまでは良く見かけるswitchのコードです。
(これが理解できない人は、もう一度入門書を読み直してみましょうε=ε=(ノ≧∇≦)ノ)
さてでは、これを踏まえて「問題!」 (←脳内変換で、平○教育委員会風の口調で再生して下さい^^)
上記コードを修正して、
n == 0 の場合、★A ⇒ ★D ⇒ ★E と順に実行、
n == 1 の場合、★B ⇒ ★D ⇒ ★E と順に実行、
n == 2 の場合、★C ⇒ ★D ⇒ ★E と順に実行、
n == 3 の場合、★Eのみ実行、
デフォルト ★Fのみ実行
されるようにするには、いったいドコをどう修正したら良いでしょうか??
~~ シンキングターイム スタート ~~
・
・
考え中
・
・
考え中
・
・
はい、時間切れー^^;)
まずは、良くある回答例です。
switch (n) {
case 0:
case 1:
case 2:
switch (n) {
case 0: ★A break;
case 1: ★B break;
case 2: ★C break;
}
// ★D
case 3:
// ★E
break;
default:
// ★F
}
switchの中に、さらにswitchをネストする方法です。
もちろんこれはこれで正解なんですが、トリッキーさはイマイチ。
そこで、↓のコードの登場です。 switch (n) {
case 0:
// ★A
if (0) {
case 1:
// ★B
}
if (0) {
case 2:
// ★C
}
// ★D
case 3:
// ★E
break;
default:
// ★F
break;
}
switchのcaseを if(0){} で囲んで、あらあらとってもトリッキー!!
追加説明をしておきますと、
switch(n) {
case 0:
/* n == 0 の時のみ実行 (複数行可) */
if (0) {
case 1:
/* n == 1 の時のみ実行 (複数行可) */
}
if (0) {
case 2:
/* n == 2 の時のみ実行 (複数行可) */
}
/* n == 0 or n == 1 or n == 2 の時のみ実行 (複数行可) */
break;
default:
/* n が 0,1,2 以外の時に実行 (複数行可) */
break;
}
使用例(メタキャラクタのエスケープ)
ここでの if(0)の挙動は、「次の1セクションが飛ばされる」というものです。
if(0)で次の1セクションがとばされて、switchのcaseで飛んできたものは実行される。
つまり、上から順次実行してきた場合はとばされ、case宛にjumpしてきたコードは実行される。
ということらしいです^^;)
(ちなみに、for(;0;) でも同じことができるらしいです)
如何だったでしょうか??
個人的には、かなりツボに入ったネタです (´^し_、^` )クスッ
【追記】
以下のコードは、コンパイルがちゃんと通ります。
#include <stdio.h>
int main(void)
{
int i,j;
for(i=0; i<8; i++)
for(j=0; j<8; j++)
switch (i)
if (j<4) {
case 0: putchar('0');
case 1: putchar('1');
case 2: putchar('2');
case 3: putchar('3');
} else {
case 4: putchar('4');
case 5: putchar('5');
case 6: putchar('6');
case 7: putchar('7');
}
}
実行結果は以下の通り~~。
(※ サイトの表示上 改行が入りますが、本来は改行なしの一行で表示されます。)
0123012301230123012301230123012312312312312312312312312323232323232323233333333345674567456745674567456745674567567567567567567567567567676767676767676777777777
ひょっとしたら参考になるかもしれないページ : Duff's device