« 纏足はシグナリング | トップページ | マイクロブラックホールといえば… »

if 文を使わずに…

 if文を使わずにprintfで表示を分岐するにはどうすれば良いか

 なんとなくそそられたので、ぼくも考えてみた。

1.実質 if 文と同じなのに、if 文じゃないと強弁する方法

int judge( int answer )
{
#define CORRECT_ANSWER 123
while( answer == CORRECT_ANSWER )

printf("correct!\n");
break;
}
while( answer != CORRECT_ANSWER )
{
printf("wrong!\n");
break;
}
}

2.わりと素直な方法

int judge( int answer )

#define CORRECT_ANSWER 123
static char *message[2] = { "correct!", "wrong!" };
printf( message[answer!=CORRECT_ANSWER] );
}

3.必要もないのに関数ポインタを使う方法

int correct()
{
 printf( "correct!\n" );
}
int wrong()
{
 printf( "wrong!\n" );
}
int judge( int answer )

#define CORRECT_ANSWER 123
 static int ( *functions[2] )()  = { correct, wrong };
 ( *functions[answer!=CORRECT_ANSWER])();
}

4.C++ の場合(まわりくどさの限界に挑戦!)

class Judgement
{
protected:
 Judgement() {}
public:
 virtual void judge() = 0;
};
class Correct : public Judgement
{
public:
 Correct() : Judgement() {}
 virtual void judge() { std::cout << "correct\n"; }
};
class Wrong : public Judgement
{
public:
 Wrong() : Judgement() {}
 virtual void judge() { std::cout << "wrong\n"; }
};
void judge( int answer )
{
#define CORRECT_ANSWER 123
 Judgement *judges[2];
 judges[0] = new Correct();
 judges[1] = new Wrong();
 judges[answer != CORRECT_ANSWER]->judge();
 delete judges[0];
 delete judges[1];
}

おあとがよろしいようで。

追記: 実装依存になるが、わざとゼロ除算例外などを発生させて、signal や catch で分岐する方法もありそう。

|

« 纏足はシグナリング | トップページ | マイクロブラックホールといえば… »

パソコン・インターネット」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/67762/51779496

この記事へのトラックバック一覧です: if 文を使わずに…:

« 纏足はシグナリング | トップページ | マイクロブラックホールといえば… »