TOP >> マニアックなプログラミング
トリッキーコードネット トリッキーなコード

【トリッキーなコード】swtichステートメントの裏技 (C言語)

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
トリッキーコードネット の TOPへ HOTNEWS の 総合TOPへ