好的,我有一个if句子,我多次比较一个特定的值。我打赌有一个更短的方法可以做到这一点:
if(letter == "%" || letter == "+" || letter == "-" || letter == "!")
我试着把它写成:
if(letter == "%" || "+" || "-" || "!")
但它工作不正确。
答案 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;
}