у меня есть for
цикл в моей программе, который является основным циклом моей программы, и он должен работать в режиме реального времени. Есть некоторые if-else
операторы внутри цикла тоже. Я хочу, если таковые имеются if
условия выполнены, программа выходит из if-else
заявления и повторите цикл for.
for(;;)
{
if(condition_one)
{
do_one();
}
else if(condition_two)
{
do_two();
}
else
{
do_three();
}
rest_of_program();
}
Я попытался написать приведенный выше код так:
for(;;)
{
if(condition_one)
{
do_one();
goto exitt;
}
else if(condition_two)
{
do_two();
goto exitt;
}
else
{
do_three();
}
exitt:
rest_of_program();
}
Но, похоже, проблема в том, что моя программа не работает! Я сделал что-то неправильно? Или есть идея получше?
Я думаю, вы слишком усложняете дело. Дело в том, что этот код:
for(;;)
{
if(condition_one)
{
do_one();
goto exitt;
}
else if(condition_two)
{
do_two();
goto exitt;
}
else
{
do_three();
}
exitt:
rest_of_program();
}
эквивалентно этому:
for(;;)
{
if(condition_one)
{
do_one();
}
else if(condition_two)
{
do_two();
}
else
{
do_three();
}
rest_of_program();
}
Отдельные блоки if-else
являются взаимоисключающими и независимо от того, какой из них выполняется, после этого будет rest_of_program
и после этого цикл продолжается.
Использовать break
заявление. Это выйдет из for
цикл:
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/break
Так как это не было упомянуто, есть также возможность использования continue
оператор для сброса в начало цикла без немедленно выход. Обратите внимание, что это будут выполнить оператор итератора в for
петля.
Не могли бы вы попробовать новый оператор IF и поместить его в верхнюю часть цикла for?
for(;;)
{
if(condition_one && condition_two){
continue
}
else if(condition_one)
{do_one();}
else if(condition_two)
{do_two();}
else {do_three();}
rest_of_program();
}
Я думаю, что это в основном то, что вы просите. Вы проверяете, удовлетворены ли оба условия, а затем возвращаетесь в свой цикл, в противном случае вы продолжаете проверять свой список.
Кстати, МНОГО ЛУЧШИХ СПОСОБОВ делать это, чем использовать GoTo, но я не видел ваш полный код, поэтому трудно найти решение, которое будет работать.
РЕДАКТИРОВАТЬ: Как указано пользователем463035818 ниже, continue
будет работать вместо goto. Сначала я немного запутался, но он прав, пропустит текущую итерацию.