2011-09-17 51 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

另一個問題是,你只能在字符上使用switch語句,我忘記說我正在使用std :: strings。 – Speed

1

問題是||運算符的任何一方都不知道對方。他們是兩個完全獨立的表達。因此"+"等方面始終是TRUE(想想如果你只是寫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