トリッキーコードネット トップへ戻る   C/C++, Java, Perl, PHP, JavaScript, アルゴリズム, ショートコーディング, IOCCCコードの解説, 等々

サイト情報

トリッキーなコード

7行プログラミング

物凄いコード集

アルゴリズム

データ構造

C/C++な話題

コードサンプル

ツール/環境構築

開発ノウハウ 等

ネタ/ジョーク集

おススメ書籍/サイト

サイトTOP >> トリッキーなコード >> swtichステートメントの裏技 (C言語)

switchステートメントの裏技 (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のコードです。 (これが理解できない人は、もう一度入門書を読み直してみましょうε=ε=(ノ≧∇≦)ノ) さてでは、これを踏まえて「問題!」 (←脳内変換で、平○教育委員会風の口調で再生して下さい^^)            ‐、, ‐        ,..‐'"´ ̄`´ ̄``‐ 、       / /,     、ヽ  \      ,i'/ / ./ ./    l. i. i、 ヽ.i、 .   ,i i .i i  .i  ∧  i. i  i  l i、     ,i i  l l   l  i  l.  i. l  l  i l     i_l_l__l__l_|、__,.|_l__l_l__l_i       i⌒l、ニ・ニ l(T)l ニ・ニ l´`i   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄      ヽ、,i`.‐-‐´ i〉` ‐-‐'i",ノ   |         i、  i‐--‐i  ./゙´   <    問 題 !!            `‐.、.` ‐'´,.‐'´      |            l``"´l          \____________        ,.、__,,..-‐| ̄0 ̄|‐- 、.__,,.、      /ヽ.i __.l  ̄|| ̄ l.__ .i/ 〉      〉\|.  \ ||  /  |/∧ 上記コードを修正して、 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');
                }
}
実行結果は以下の通り~~。(※ サイトの表示上、改行を入れていますが、本来は改行なしの一行で表示されます) 01230123012301230123012301230123123123123123123123123123 23232323232323233333333345674567456745674567456745674567567567567567567567567567676767676767676777777777
ひょっとしたら参考になるかもしれないページ : Duff's device
         このエントリーをはてなブックマークに追加   


作業効率化・ライフハックのオススメ記事




コンピュータ・テクノロジーのオススメ記事





恋愛・人間関係のオススメ記事




※ 当サイトは、トップページからリンクで辿る事の出来るページに限り、リンクフリーです。
※ 当サイトの閲覧/利用によって生じた如何なる損害も、当サイト管理人は責任を負いません。
※ 当サイトの内容を転載される場合は、当サイトへのリンクをお願い致します。