如何正确缩短C ++中的if语句?

时间:2011-09-17 20:59:09

标签: c++ if-statement

好的,我有一个if句子,我多次比较一个特定的值。我打赌有一个更短的方法可以做到这一点:

if(letter == "%" || letter == "+" || letter == "-" || letter == "!")

我试着把它写成:

if(letter == "%" || "+" || "-" || "!")

但它工作不正确。

6 个答案:

答案 0 :(得分:6)

这样的事可能有用:

string s("%+-!");
if (s.find(letter) != string::npos) { ... } 

答案 1 :(得分:2)

尽可能短。你可以重写它,在Boost的帮助下它可能是

if( boost::is_any_of( "%+-!" )( letter ) )

答案 2 :(得分:2)

尝试使用switch语句而不是if。打字并不少,但它确实允许你只写一次“字母”。一些程序员喜欢switch语句的可视化布局。注意,switch仅适用于char(非std :: string)等标量类型。

switch (letter)
{
  case '%':
  case '+':
  case '-':
  case '!':
     // if letter is %,+,-,!
     // code goes here for matching letter 
     break;
  default:
     // else do something different
     // code goes here for letter that doesn't match
}

有关类似示例,请参阅http://www.cplusplus.com/doc/tutorial/control/页面底部。

答案 3 :(得分:1)

char op[4] = { '%', '+', '-', '!' };
char * opEnd(op + 4);
if (opEnd != find(op, opEnd, letter))

可替换地:

if (string("%+-!").find(letter) != string::npos)

答案 4 :(得分:1)

问题是||运算符的任何一方都不知道彼此。他们是两个完全独立的表达。因此,"+"等总是评估为真(想想如果你刚写if ("+")会发生什么 - 它会衰减到非NULL的指针

有时我发现使用std::find和迭代器对来表达这类问题更为清晰:

#include <iostream>
#include <algorithm>

void test(const char letter) {
  static const char c[] = {'%', '+', '-', '!'};
  static const char *begin=c, *end=&c[sizeof(c)/sizeof(*c)];
  if (std::find(begin, end, letter) != end) {
    std::cout << "Matched " << letter << std::endl;
  }
}

int main() {
  test('a');
  test('%');
  test('!');
}

答案 5 :(得分:1)

我猜最终结果是尽可能少地打字,并尝试通过使用像英语这样熟悉的东西来快速理解你的代码。

你的代码读起来就像是,'我的信是否等于这个以及这个和这个以及'。它可能有点长,但很快就能理解。

不幸的是,c ++编译器并没有真正做到'是我的信等于这些'。这对我们大多数人来说可能是英语,但对于糟糕的编译器可能不是英语。)

作为一名程序员,您有能力隐藏编译器识字缺陷,保持代码可以理解并且输入更少。

 if( letterIsOneOfThese( letter, "%+-!") )
 {
    // do something

 }


bool letterIsOneOfThese( const char letter, const char* letterList ) 
{
    int len = strlen( letterList );
    while( len-- )
    {
        if( letterList[len] == letter )
        {
            return true;
        }
    }

    return false;

}