Можно ли использовать диапазон в switchcase, как в Паскале?

в операторе case в Паскале я могу использовать это:

Var i : integer;  
...  
Case i of   
 1..5 : DoSomething;  
end;

Мне было интересно, есть ли способ сделать это с помощью C/C++ в компиляторе Arduino, используя:

switch (var) {
   case 1..5:
     // statements
     break;

или это возможно только с использованием if/else?

, 👍1


2 ответа


Лучший ответ:

2

Короткий ответ: Нет

Более длинный ответ: каждый случай в операторе switch должен быть дискретным значением (вот почему float и double тоже не будут работать), но есть способ обойти это. В порядке предпочтения:

A) Используйте функцию «сквозного пропуска»

switch (value)
{ 
  case 1: // Преднамеренное падение
  case 2: // Преднамеренное падение
  case 3: // Преднамеренное падение
  case 4: // Преднамеренное падение
  case 5:
    DoThingA();
    break;
  case 6:
    DoThingB();
    break;
}

Б) Измените логику так, чтобы диапазон был установлен по умолчанию (не очень хорошо, но если у вас нет другого выбора):

switch (value)
{ 
  case 6:
    DoThingB();
    break;
  default:
    DoThingA();
    break;
}

C) Использовать вспомогательную функцию (действительно некрасиво, но...). Должна быть веская причина не вызывать DoThing() из вспомогательной функции.

enum DoOptions {EOptionA, EOptionB};
DoOptions DoWhat (int value)
{
  if (value < 6) return EOptionA;
  return EOptionB;
}
switch (DoWhat(value))
{ 
  case EOptionA:
    DoThingA();
    break;
  case EOptionB:
    DoThingB();
    break;
}
,

4

В компиляторах avr-gcc/avr-g++ (используемых в Arduino IDE для плат Arduino на базе AVR) доступны некоторые расширения GNU. Одно из них — поддержка ... для случая:

  switch (i)
  {
    case  10 ... 100:  Serial.println(F("First"));           break;
    case 101 ... 1000: Serial.println(F("Second"));          break;
    default:           Serial.println(F("Everything else")); break; 
  }

Но это не часть стандарта C/C++, это просто расширение компилятора, поэтому есть вероятность, что оно не скомпилируется на разных платформах (в основном, из-за разных компиляторов). Поэтому лучше избегать его в переносимом коде.

,