2011-09-17 5 views
1

さて、私は特定の値を複数回比較するif文を持っています。私はこれを行うには短い方法がある賭ける:C++でif文を正しく短くするには?

if(letter == "%" || letter == "+" || letter == "-" || letter == "!") 

私のようにそれを書いてみました:

if(letter == "%" || "+" || "-" || "!") 

しかし、それは間違って動作します。このような

+4

あなたは文字を比較している場合、それは ''「%」 '「%」と'とはならない、後者は 'のstrcmp()'と比較すべき文字列リテラルです。 –

+2

'strcmp()'はC++でですか? – Flexo

答えて

6

何かがうまくいくかもしれない:

、できる限り短いです
string s("%+-!"); 
if (s.find(letter) != string::npos) { ... } 
+2

+1これは間違いなく、よく使われているイディオムだが、私はいつも問題解決のための解決策だと思った:-) – xanatos

+0

これはかなり見栄えが良く、機能の中に包まれているため誤った使用を防ぐ/短くする。 – Speed

2

。あなたはそれがまた

if(boost::is_any_of("%+-!")(letter)) 
1
char op[4] = { '%', '+', '-', '!' }; 
char * opEnd(op + 4); 
if (opEnd != find(op, opEnd, letter)) 

可能性がブーストからいくつかの助けを借りて、しかしそれを書き換えることができます:

if (string("%+-!").find(letter) != string::npos) 
2

を場合に、代わりのswitch文を試してみてください。それほどタイピングはしませんが、「文字」は一度だけ書くことができます。あるプログラマはswitch文の視覚的なレイアウトを好みます。注意してください。スイッチはchar(std :: stringではなく)のようなスカラー型でのみ動作します。

switch (letter) 
{ 
    case '%': 
    case '+': 
    case '-': 
    case '!': 
    // if letter is %,+,-,! 
    // code goes here for matching letter 
    break; 
    default: 
    // else do something different 
    // code goes here for letter that doesn't match 
} 

は同様の例のためにhttp://www.cplusplus.com/doc/tutorial/control/で、ページの下部を参照してください。

+0

これは正確に短くはなく、複数の行に分かれ始めます。 – Speed

+0

ええ、私は私の推測では、より明快で効率的なリライトの種類だと思います。上記の他の答えは間違いなく短いです(私よりもタイピングが少ない)。 ;-) –

+0

もう1つの問題は、switch文をcharsにのみ使用できることです。std :: stringsを使用していたことを忘れてしまいました。 – Speed

1

問題は、||オペレータのどちらの側も互いに知りません。彼らは完全に独立した2つの表現です。その結果"+"は常に真として評価など(あなただけif ("+")を書いた場合に何が起こるかを考える - それは非であるポインタに崩壊するNULL

時々私はstd::findを使用してこの種の問題を表現するクリーナーです見つけるとイテレータのペア:

#include <iostream> 
#include <algorithm> 

void test(const char letter) { 
    static const char c[] = {'%', '+', '-', '!'}; 
    static const char *begin=c, *end=&c[sizeof(c)/sizeof(*c)]; 
    if (std::find(begin, end, letter) != end) { 
    std::cout << "Matched " << letter << std::endl; 
    } 
} 

int main() { 
    test('a'); 
    test('%'); 
    test('!'); 
} 
1

私は、最終的な結果は、できるだけを入力して、英語のような身近なものを使って理解するために迅速あなたのコードを維持しようとすることだと思います。

あなたのコードは、「これとこれとこれとこれに等しい私の文字は何ですか?それは少し長いかもしれませんが、理解するのはかなり速いです。

残念ながら、C++コンパイラは「私の手紙はこれらと同じですか?ほとんどの人にとって英語ではありますが、コンパイラではないかもしれません:)

プログラマとして、コンパイラの識字率を隠す力があります。コードを理解しやすく、型を少なくしてください。

if(letterIsOneOfThese(letter, "%+-!")) 
{ 
    // do something 

} 


bool letterIsOneOfThese(const char letter, const char* letterList) 
{ 
    int len = strlen(letterList); 
    while(len--) 
    { 
     if(letterList[len] == letter) 
     { 
      return true; 
     } 
    } 

    return false; 

} 
+0

と 'std :: string'と' find'や 'boost :: is_any_of'を使用した場合と比べて、これは私にホイールを再発明するように見えます。 – Flexo

+1

気に入った実装があればboost/std :: stringを自由にラップしてください。あなたが時間をかけて80%を費やしているので、すぐに理解できるものを作ることは良いことです。 – RobM

関連する問題