Я собираюсь предположить, что ваша мотивация для этого вопроса заключается либо в том, что вы хотите избежать написания избыточного / дублирующего кода, либо в том, что вы хотите минимизировать циклы ЦП, не выполняя одну и ту же математическую операцию более одного раза.Методы, описанные ниже, пытаются решить обе эти проблемы.
Первый вопрос: должен ли ваш код выполнять оба случая, один за другим?Если это так, вы можете сделать это с помощью функции «проваливать» оператора switch, то есть, опуская оператор break;
в конце первого случая, вы можете позволить выполнению программы «провалиться» до следующегоcase сразу после выполнения первого case, например:
int x = 5;
switch(someVariable)
{
case 1:
x += 6;
// fall through!
case 2:
cout << "x=" << x << endl;
break;
}
Или, возможно, вам нужен более традиционный паттерн, где каждый case
имеет break;
в конце, и вы хотите выполнить только один изслучаи.В этом случае выполнение этого ...
int addSix(int x) {return x+6;} // helper function
[...]
int x = 5;
switch(someVariable)
{
case 1:
cout << "x=" << addSix(x) << endl;
break;
case 2:
cout << "y=" << addSix(x) << endl;
break;
}
... избавляет от необходимости писать избыточный код (т. Е. Вам нужно было только написать код внутри addSix(int)
в одном месте), но это означает, чточто код внутри addSix(int)
выполняется каждый раз, когда выполняется оператор switch.Для простых вычислений это хорошо, но что, если ваши вычисления были действительно вычислительно дорогостоящими, настолько, что вы хотите избегать их выполнения более одного раза, когда это возможно?Для этого вы можете использовать метод под названием memoization , который на самом деле просто хранит результат вычисления в переменной, а также устанавливает флаг при первом выполнении вычисления, чтобы вы могли помнить, что не делать этогов следующий раз:
void doReallyExpensiveCalculationOnce(int & x, bool & isCalculationValid)
{
if (isCalculationValid == false)
{
x += 6; // pretend this operation is really slow/expensive
isCalculationValid = true; // remember we already did the calculation
}
}
bool isCalculationValid = false;
int x = 5;
for (int i=0; i<1000000; i++)
{
switch(someVariable)
{
case 1:
doReallyExpensiveCalculationOnce(x, isCalculationValid);
cout << "x=" << x << endl;
break;
case 2:
doReallyExpensiveCalculationOnce(x, isCalculationValid);
cout << "y=" << x << endl;
break;
}
}
Обратите внимание, что хотя вышеприведенный цикл for приводит к выполнению оператора switch 1000000 раз, очень дорогие вычисления обновляют значение x
выполняются (максимум) один раз.