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