2016-06-22 30 views
0

コードが短ければボーナスポイントが得られるコーディング競争の準備をしています。私はスイッチのcase文から 'case'キーワードを '#define'できるかどうか疑問に思っていたので、スイッチのcase文を競合で使用しなければならない場合、スイッチに何度も 'case'キーワードを入力する必要はありませんステートメント。#define switch case文でC++キーワード 'case'?

例コードスニペット:

   switch(input_string[0]) 
     { 
      case '+':p = (a + b);t; 
      case '-':p = (a - b);t; 
      case '*':p = (a * b);t; 
      case '/':p = (a/b);t; 
      case '%':p = (a % b);t; 
      case '^':p = pow(a,b);t; 
     } 

、B及びpは整数です。文字input_string [0]が '+'のとき、aとbが加算され、その合計がpに代入されます。

重要:上記のコードスニペットの「t」はbreak文です。私は '#define t break;'を使用しました。私はbreakキーワードを複数回書く必要はありません。私は 'case'キーワードで同じことができるのだろうかと思っていました。

私は「の#define Cケース」としてケースを定義し、私は結果のコードスニペットは、次のようになりますように、スイッチケースの文で「ケース」を使用する必要がどこに「C」を使用することができます

 switch(e[i]) 
     { 
      c '+':p = (a + b);t; 
      c '-':p = (a - b);t; 
      c '*':p = (a * b);t; 
      c '/':p = (a/b);t; 
      c '%':p = (a % b);t; 
      c '^':p = pow(a,b);t; 
     } 

はい、あなたはそれを行うことができ

+4

ちょうどそれを試してみてください。しかし、これが競争が「ショートコード」の意味であることを確認してください。それが難読化コンテストでない限り、これは反対に、コードが判読不能になるため、否定的な点を招いています。難読化の競合以外では、「短いコード」は通常、文字数ではなく、複雑さと定型文の観点から測定されます。 –

+3

この質問を書くのに時間がかかりましたが、あなたは自分で試してみることができました。 – 0x5453

+2

ITYM '#define c case'ではなく、' #define c case'です。それは非常に悪い考えです。 'c'というローカル変数を定義すると、いつでも' case'に変換され、やりがいが起こります。 –

答えて

2

私はそれをやっていないお勧めします。あなたがそれを行う場合でも、未定義にしてくださいそれは非常に悪いことは、プロセッサが実行するトークン代替施設は基本的である。この場合、どのような状況であれ

#define c case 
    #define t break; 
    switch(e[i]) 
    { 
     c '+':p = (a + b);t; 
     c '-':p = (a - b);t; 
     c '*':p = (a * b);t; 
     c '/':p = (a/b);t; 
     c '%':p = (a % b);t; 
    } 
    #undef c 
    #undef t 

cが見られ、中にされてどこにでも起こるのだろう、他のすぐ実際のコンパイルの前に。


これはあなたの元のコードよりもさらに短い:あなたが見ることができるように、

#define c case 
#define t break 
switch(e[i]){c'+':p=(a+b);t;c'-':p=(a-b);t;c'*':p=(a*b);t;c'/':p=(a/b);t;c'%':p=(a % b);t;c'^':p=pow(a,b);} 
#undef c 
#undef t 

それは何だ場合は、コードの難読化に

+0

申し訳ありません、私は "#define c case"を元のコードでのみ使用しました。私は間違って質問に入れ替えました。私はエラー "エラー:期待された"ケース "表現の前にキーワード"を何となく続けている。空白を 'c'と '+'の間で削除しても –

+0

はい、あなたのソリューションは美しく機能しました。私はすぐにそれを使用した後にそれを定義し、エラーは消えた。ありがとうございました。 –

+0

@SrihariVigneshこれは、マクロを定義したときに、プリプロセッサがトークン 'c'を見るたびに、' case'で置き換えられます。これは、そのマクロが 'undef'されるまで起こります。翻訳単位の終わりまで – WhiZTiM

0

を:「式の前に期待される 『ケース』キーワードのエラー」 - 私は「の#define Cケース」をやってみましたが、私は次のエラーを取得します。必要に応じて、C++キーワードをマクロに置き換えることができます。

ただし、既存の識別子と衝突しないように注意する必要があります。他の場所にあるcトークンを使用すると、プリプロセッサが実行されるときに "大文字小文字"になります。

P.S.プログラムの中で文字通り最少数の文字でコードの不足が定量化された場合、その厄介な空白を取り除きます。

+0

私はすでにそれを使用しようとしましたが、エラー "エラー:予期された 'case'キーワードの前に" –

+0

幸いにも彼らが使用するエディタは空白を数えません:) –

+1

@SrihariVignesh - マクロが正しく定義されていない次に。あなたがあなたの質問でしたようにマクロを定義しているなら、値をスワップする必要があります: '#define c case'。 –

0

に挑戦する以外短いは、非常に悪い考えです代わりに#define c caseをする必要がありますか?何をしようとすると、caseですべてc Sを交換し、cですべてcase Sを交換しないことです。それは次のとおりです。

#define c case 

switch(e[i]) 
    { 
     c '+':p = (a + b);t; 
     c '-':p = (a - b);t; 
     c '*':p = (a * b);t; 
     c '/':p = (a/b);t; 
     c '%':p = (a % b);t; 
     c '^':p = pow(a,b);t; 
    }