#c #switch-statement
#c #switch-оператор
Вопрос:
Я новичок в использовании C , и мне нужно передать некоторую информацию или значения из одного обращения в другое дело в том же коммутаторе.
Это похоже на то, что у меня есть переключатель, и я назвал случай 1 и случай 2. В случае 1 я собираюсь выполнить некоторые математические операции с переменной, которую мне предоставит пользователь. Например, если входные данные равны 5, я собираюсь добавить 6, тогда будет 11. И в случае 2 мне нужна эта информация, мне нужна сумма, которую случай 1 уже рассчитал. Но я не знаю, как это сделать. Я предпочитаю не использовать switch внутри другого коммутатора, idk, если он работает, но я не могу его использовать. Спасибо.
Комментарии:
1. Покажите свой код. Рассмотрите возможность использования ключевого слова continue .
2. У вас есть возможность не использовать
break
ключевое слово в конце каждого обращения, но без кода я даже не могу сказать вам, имеет ли смысл это делать. Не могли бы вы добавить код.3. Это похоже на проблему X-Y. Чего вы пытаетесь достичь в более широком смысле? Зачем вам нужно «передавать информацию между обращениями»?
Ответ №1:
Я собираюсь предположить, что ваша мотивация для этого вопроса заключается либо в том, что вы хотите избежать написания избыточного / дублирующего кода, либо в том, что вы хотите минимизировать циклы процессора, не выполняя одну и ту же математическую операцию более одного раза. Методы, описанные ниже, направлены на решение обеих этих проблем.
Первый вопрос: предполагается ли, что ваш код выполняет оба случая один за другим? Если это так, вы можете сделать это, используя функцию «проваливания» оператора switch, то есть, опустив break;
оператор в конце первого обращения, вы можете позволить выполнению программы «провалиться» до следующего обращения сразу после выполнения первого обращения, например:
int x = 5;
switch(someVariable)
{
case 1:
x = 6;
// fall through!
case 2:
cout << "x=" << x << endl;
break;
}
Или, возможно, вам нужен более традиционный шаблон, где у каждого case
есть a 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. Для тривиальных вычислений это нормально, но что, если ваши вычисления были действительно дорогостоящими с точки зрения вычислений, настолько, что вы хотите по возможности избегать их выполнения более одного раза? Для этого вы можете использовать технику, называемую запоминанием, которая на самом деле просто сохраняет результат вычисления в переменной, плюс устанавливает флаг при первом выполнении вычисления, чтобы вы могли помнить, чтобы не делать этого в следующий раз:
void doReallyExpensiveCalculationOnce(int amp; x, bool amp; 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
выполняются (не более) только один раз.