さて、私は特定の値を複数回比較するif文を持っています。私はこれを行うには短い方法がある賭ける:C++でif文を正しく短くするには?
if(letter == "%" || letter == "+" || letter == "-" || letter == "!")
私のようにそれを書いてみました:
if(letter == "%" || "+" || "-" || "!")
しかし、それは間違って動作します。このような
さて、私は特定の値を複数回比較するif文を持っています。私はこれを行うには短い方法がある賭ける:C++でif文を正しく短くするには?
if(letter == "%" || letter == "+" || letter == "-" || letter == "!")
私のようにそれを書いてみました:
if(letter == "%" || "+" || "-" || "!")
しかし、それは間違って動作します。このような
。あなたはそれがまた
if(boost::is_any_of("%+-!")(letter))
char op[4] = { '%', '+', '-', '!' };
char * opEnd(op + 4);
if (opEnd != find(op, opEnd, letter))
可能性がブーストからいくつかの助けを借りて、しかしそれを書き換えることができます:
if (string("%+-!").find(letter) != string::npos)
を場合に、代わりの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/で、ページの下部を参照してください。
問題は、||
オペレータのどちらの側も互いに知りません。彼らは完全に独立した2つの表現です。その結果"+"
は常に真として評価など(あなただけ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('!');
}
私は、最終的な結果は、できるだけを入力して、英語のような身近なものを使って理解するために迅速あなたのコードを維持しようとすることだと思います。
あなたのコードは、「これとこれとこれとこれに等しい私の文字は何ですか?それは少し長いかもしれませんが、理解するのはかなり速いです。
残念ながら、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;
}
あなたは文字を比較している場合、それは ''「%」 '「%」と'とはならない、後者は 'のstrcmp()'と比較すべき文字列リテラルです。 –
'strcmp()'はC++でですか? – Flexo