2011-02-18 27 views
3

我有這樣的代碼:愚蠢的C++問題有關的if-else

#include <iostream> 
using namespace std; 

int main() 

{ char c='6'; 
    if(c == '+' || '-' || '*' || '^' || '/' || '%') 
    { 
     cout<<"good"; 
    } 
    else {cout<<"bad";} 
    return 0; 
} 

我想寫「好」,如果一個字符是「+」或 - 如果焦炭等,並寫上「壞」「」是別的。 但是這段代碼總是用「char」來寫「good」。

問題在哪裏?謝謝。

+1

提問之前,請先閱讀book.You會更容易找到一個回答這些問題。 – 2011-02-18 14:49:14

+1

你知道,如果這是COBOL,你會走在正確的軌道上! :P(如果C =「+」或「 - 」或「*」或「^」或「/」或「%」那麼......會按需要工作)。但是,恩,對,C++問題。沒關係。 – rskar 2011-02-18 19:11:43

回答

6

應該

if(c == '+' || c == '-' || c == '*' || c == '^' || c == '/' || c == '%') 
... 

否則表達式總爲真。任何這些字符都有一個不同於0的值,對於C++來說也是如此。

16

if(c == '+' || '-' || '*' || '^' || '/' || '%')

解析到

if((c == '+') || ('-'!=0) || ('*'!=0 || ('^'!=0) || ('/'!=0) || ('%'!=0))

它將始終評估爲true,因爲 ' - ' 確實不等於零。當然,這是一種類型安全的缺陷,一個字符會「降級」爲一個布爾值,並將其評估爲true。 (正確的類型安全解決方案將不會編譯您的代碼,除非您明確施放)。

你想知道的是c是否是這些值之一。有很多方法可以做到這一點。除了縮進,如果你可以使用庫特徵:

C函數,和strchr:

if(strchr("+-*^/%", c) != NULL)

switch語句

switch (c) 
{ 
    case '+': case '-': case '*': case '^': case '/': case '%': 
     // true logic 
    break; 

    default: 
    // false logic 
}; 

正則表達式

(這裏矯枉過正,但純粹主義者會喜歡它)。

的std :: bitset的

這需要大量的「設置」,但如果你有一個固定的字符集和大量的變量字符的,看它是否在集合存在,這是最快的方法去做吧。

// one-time setup 
std::bitset<256> myCharSet; 
myCharSet.set('+'); 
myCharSet.set('-'); 
myCharSet.set('*'); 
myCharSet.set('^'); 
myCharSet.set('/'); 
myCharSet.set('%'); 

// subsequently 
if(myCharSet.test(static_cast<unsigned char>(c))) 
{ 
    // true logic 
} 
else 
{ 
    // false logic 
} 

靜態數組

類似的解決方案,但的BitSet你不介意浪費幾個字節。 static bool charset [256] = {false}; static bool init = false; if(!init) { charset ['+'] = true; //等 init = true; }

if(charset[ static_cast<unsigned char>(c) ]) 
{ 
    // true logic 
} 
else 
{ 
    // false logic 
} 

而且你可以做一個類,這是否從您要檢查字符的字符串初始化(加上一些邏輯,以一個0字節是否是真還是假,如果字符串你通過以null結尾)。

與bitset一樣,這是恆定時間查找。

還有其他的選擇(例如,使用find和std :: find的C++ std :: string類),但是這些現在都可以使用。

8

更改您如果到:

if(c == '+' || c == '-' || c == '*' || c == '^' || c == '/' || c == '%') 

或更好:

switch (c) 
{ 
    case '+': case '-': case '*' : case '^' : case '/' : case '%': 
     cout << "good\n"; break; 
    default: cout << "bad\n"; break; 
}