Как правильно сократить оператор if в C ++? - PullRequest
1 голос
/ 18 сентября 2011

Хорошо, у меня есть предложение if, в котором я сравниваю определенное значение несколько раз.Могу поспорить, что есть более короткий способ сделать это:

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

Я попытался написать это как:

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

Но это работает неправильно.

Ответы [ 6 ]

6 голосов
/ 18 сентября 2011

Примерно так может работать:

string s("%+-!");
if (s.find(letter) != string::npos) { ... } 
2 голосов
/ 18 сентября 2011

Попробуйте оператор 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/ для аналогичного примера.

2 голосов
/ 18 сентября 2011

Это так коротко, как может.Вы можете переписать его, хотя, с некоторой помощью Boost это может быть

if( boost::is_any_of( "%+-!" )( letter ) )
1 голос
/ 18 сентября 2011

Полагаю, конечный результат - набирать как можно меньше текста и стараться, чтобы ваш код был быстрым для понимания, используя что-то знакомое, например английский.

Ваш код читается примерно так: «Мое письмо равно этому, этому, этому, этому и этому» Это может быть немного затянуто, но это довольно быстро понять.

К сожалению, компиляторы с ++ на самом деле этого не делают, «мое письмо равно этим». Что может быть английским для большинства из нас, но не для плохих компиляторов:)

Как программист, у вас есть возможность скрывать недостатки грамотности компилятора, сохранять код понятным, а также печатать меньше.

 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;

}
1 голос
/ 18 сентября 2011

Проблема в том, что обе стороны оператора || не знают друг друга.Это два совершенно независимых выражения.Следовательно, "+" и т. Д. Всегда оценивают как истинные (подумайте о том, что произойдет, если вы только что написали 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('!');
}
1 голос
/ 18 сентября 2011
char op[4] = { '%', '+', '-', '!' };
char * opEnd(op + 4);
if (opEnd != find(op, opEnd, letter))

В качестве альтернативы:

if (string("%+-!").find(letter) != string::npos)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...