Подтвердить что ты не робот

Группировка операторов сложения вместе?

Возможно, я кое-что смотрю, но есть ли простой способ на С++ объединить дела вместе, а не писать их отдельно? Я помню, в основном я мог просто сделать:

SELECT CASE Answer
CASE 1, 2, 3, 4

Пример в С++ (для тех, кто в этом нуждается):

#include <iostream.h>
#include <stdio.h>
int main()
{
   int Answer;
   cout << "How many cars do you have?";
   cin >> Answer;
   switch (Answer)                                      
      {
      case 1:
      case 2:
      case 3:
      case 4:
         cout << "You need more cars. ";
         break;                                        
      case 5:
      case 6:
      case 7:
      case 8:
         cout << "Now you need a house. ";
         break;                                        
      default:
         cout << "What are you? A peace-loving hippie freak? ";
      }
      cout << "\nPress ENTER to continue... " << endl;
      getchar();
      return 0;
}
4b9b3361

Ответ 1

Нет, но вы можете с цепочкой if - else if - else, которая достигает такого же результата:

if (answer >= 1 && answer <= 4)
  cout << "You need more cars.";
else if (answer <= 8)
  cout << "Now you need a house.";
else
  cout << "What are you? A peace-loving hippie freak?";

Вы также можете обработать случай с 0 автомобилями, а затем и неожиданный случай отрицательного числа автомобилей, вероятно, выбросив исключение.

PS: я переименовал Answer в Answer, так как считал, что плохой стиль запускает переменные с заглавной буквой.

В качестве побочного примечания языки сценариев, такие как Python, позволяют использовать хороший синтаксис if answer in [1, 2, 3, 4], который является гибким способом достижения того, что вы хотите.

Ответ 2

AFAIK все, что вы можете сделать, это опустить возвраты, чтобы сделать вещи более компактными в С++:

switch(Answer)
{
    case 1: case 2: case 3: case 4:
        cout << "You need more cars.";
        break;
    ...
}

(Разумеется, вы также можете удалить другие возвраты).

Ответ 3

Конечно.

Вы можете использовать случай x... y для диапазона

Пример:

#include <iostream.h>
#include <stdio.h>
int main()
{
   int Answer;
   cout << "How many cars do you have?";
   cin >> Answer;
   switch (Answer)                                      
      {
      case 1 ... 4:
         cout << "You need more cars. ";
         break;                                        
      case 5 ... 8:
         cout << "Now you need a house. ";
         break;                                        
      default:
         cout << "What are you? A peace-loving hippie freak? ";
      }
      cout << "\nPress ENTER to continue... " << endl;
      getchar();
      return 0;
}

Убедитесь, что в компиляторе включен флаг -std = С++ 0x

Ответ 4

Вы не можете удалить ключевое слово case. Но ваш пример можно записать короче:

switch ((Answer - 1) / 4)                                      
{
   case 0:
      cout << "You need more cars.";
      break;                                        
   case 1:
      cout << "Now you need a house.";
      break;                                        
   default:
      cout << "What are you? A peace-loving hippie freak?";
}

Ответ 5

Ваш пример такой же кратким, как и с конструкцией switch.

Ответ 6

gcc имеет так называемое расширение "case range":

http://gcc.gnu.org/onlinedocs/gcc-4.2.4/gcc/Case-Ranges.html#Case-Ranges

Я использовал это, когда использовал только gcc. Не так много сказать об этом - он делает то, что вы хотите, но только для диапазонов значений.

Самая большая проблема заключается в том, что только gcc поддерживает его; это может быть или не быть проблемой для вас.

(Я подозреваю, что для вашего примера утверждение if было бы более естественным.)

Ответ 7

Вы можете использовать следующее:

case 4: case 2:
 {
   //code ...
 }

Для использования футляра типа 4 или 2.

Ответ 8

Если вы готовы пойти на путь злоупотребления препроцессором, Boost.Preprocessor может вам помочь.

    #include <boost/preprocessor/seq/for_each.hpp>

    #define CASE_case(ign, ign2, n) case n:

    #define CASES(seq) \
        BOOST_PP_SEQ_FOR_EACH(CASE_case, ~, seq)

    CASES((1)(3)(15)(13))

Выполняя это через gcc с помощью -E -P только для запуска препроцессора, расширение CASES дает:

    case 1: case 3: case 15: case 13:

Обратите внимание, что это, вероятно, не будет проходить проверку кода (не будет, где я буду работать!), поэтому я рекомендую ограничить его личное использование.

Также должно быть возможно создать макрос CASE_RANGE(1,5) для расширения до

    case 1: case 2: case 3: case 4: case 5:

для вас.

Ответ 9

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