关于if-else的愚蠢C ++问题

时间:2011-02-18 13:46:01

标签: c++

我有这段代码:

#include <iostream>
using namespace std;

int main()

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

如果char为'+'或' - '等,我想写“好”,如果char是其他的则写“bad”。 但是这段代码总是用任何字母写“好”。

问题出在哪里?感谢。

4 个答案:

答案 0 :(得分:16)

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

解析

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

它总是会评估为true,因为' - '确实不等于零。当然,这是一种带有类型安全性的缺陷,即char“降级”为布尔值并且计算结果为true。 (正确的类型安全解决方案根本就是不编译代码,除非你明确地转换)。

您想知道的是c是否是其中一个值。有很多方法可以做到这一点。除了缩进之外,如果你可以使用库功能:

C function strchr:

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

切换声明

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

  default:
   // false logic
};

正则表达式

(这里过度杀戮但是纯粹主义者会喜欢它)。

<强>的std ::位集

这需要大量的“设置”,但是如果你有一组固定的字符和大量的变量字符来查看它是否存在于集合中,这是最快的方法。

// 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字节是真还是假的逻辑,如果你传递的字符串是空终止的) 。

与bitset一样,这是恒定时间查找。

还有其他选项(例如使用find和std :: find使用C ++ std :: string类)但这些选项现在都可以。

答案 1 :(得分:8)

将您的if更改为:

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

或更好:

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

答案 2 :(得分:6)

应该是

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

否则表达式总是评估为true。这些字符中的任何一个都具有不同于0的值,因此对于c ++来说是正确的。

答案 3 :(得分:-1)

简单答案:
'-'是该字符的ASCII(计算机对字符进行编码的方式)值-不为0,因此为true(计算机的逻辑)。 其他所有字符都相同。所以我们得到了:
c =='+'||真实||真实||真实||真实|| true,总是 true。
您应该做什么:
c =='+'|| c =='-'|| c =='*'|| c =='^'|| c =='/'|| c =='%'
错误可能是您认为“它必须等于或等于或等于或等于”等等。这件事发生在每个人身上,只要记住计算机不会说英语即可。