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類),但是這些現在都可以使用。
提問之前,請先閱讀book.You會更容易找到一個回答這些問題。 – 2011-02-18 14:49:14
你知道,如果這是COBOL,你會走在正確的軌道上! :P(如果C =「+」或「 - 」或「*」或「^」或「/」或「%」那麼......會按需要工作)。但是,恩,對,C++問題。沒關係。 – rskar 2011-02-18 19:11:43