2011-02-18 48 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; 
}