Особенности оператора for - цикла с предусловием и параметром.



Выделим некоторые специфические особенности использования оператора for в языке С++:

· условие продолжения цикла вычисляется на каждой итерации, поэтому не стоит в этом месте заставлять компилятор вычислять сложные выражения, если, конечно, в этом нет необходимости с точки зрения удобства решения задачи (если есть такая возможность, то лучше вычислить условие продолжения цикла один раз до начала цикла):

 

for ( int i=0; i<x*y*z; i++) { тело цикла }

 

Если переменные x , y , z в теле цикла не изменяются, то эффективнее такую задачу реализовать так:

int n=x*y*z; for ( int i=0; i<n; i++) { тело цикла }

· три составляющих цикла (инициализация; выражение1; модификация) разделяются обязательными символами (точка с запятой), а сами составляющие (все три) необязательны. Если необязательные составляющие опустить, получится бесконечный цикл for (; ;) {…}.

· в любой части цикла можно записать и несколько выражений (операторов), разделенных запятой, а не точкой с запятой, например, так:

for ( int i =0, j =2; … //область видимости локальных //переменных i и j - цикл int k; double rez; for (k=0, rez=1; k<100; k++, rez+= rez/k) { тело цикла }

Однако условие продолжения цикла во избежание ошибок всегда следует записывать как одно выражение, т.к. из нескольких выражений, разделенных запятой, компилятор перед выполнением очередной итерации цикла будет проверять на истинность только последнее

· видимость переменных, объявленных в инициализирующей части распространяется до закрывающей фигурной скобки цикла

· не стоит смешивать в инициализирующей части выражения и объявления, например:

for ( int i=0, double sum=0; i<100;i++) { sum+=…; …}

Компилятор воспримет все как список объявлений, проигнорирует double в приведенном примере, выдаст предупреждение и будет интерпретировать sum как int

· тело цикла может быть пустым:

for ( int i=0, sum=0; i<n; sum+=i, i++);

 

Операторы передачи управления

Для досрочного выхода из цикла можно использовать операторы break и continue. Оператор break используется внутри операторов цикла или, как уже было показано, внутри переключателя switch для прерывания выполнения цикла и обеспечения перехода в точку программы, находящуюся непосредственно за оператором, внутри которого находится break. Оператор continue -  это оператор перехода к следующей итерации, он пропускает все операторы, оставшиеся до конца тела цикла, и передает управление на начало следующей итерации.

Приведем два небольших фрагмента программного кода, иллюстрирующих операторы прерывания цикла.

Пусть необходимо ввести максимально N целых чисел и просуммировать введенные положительные значения, а если очередное введенное число окажется отрицательным, то прекратить суммирование и выйти из цикла.

 

В следующем примере изменим условие – введем все N чисел, но просуммируем только положительные, а отрицательные проигнорируем.

 

Оператор return прерывает выполнение текущей функции и возвращает управление вызвавшей функции.

Оператор goto осуществляет безусловный переход (только в пределах одной функции!) к оператору, перед которым стоит метка. Использование этого оператора нарушает принципы структурного программирования, по которым все блоки, их которых состоит программа, должны иметь только один вход и один выход, и усложняет отладку. Практически не существует ситуаций, в которых использование goto является необходимостью, всегда существуют более подходящие алгоритмические средства. Использование goto оправдано только в том случае, если необходим принудительный выход вниз по тексту программы из нескольких вложенных циклов или переключателей (т.к. break прекращает выполнение только самого внутреннего цикла). И даже в этом случае оператор goto допустимо применить только, если в этих фрагментах кода нигде не создаются никакие локальные объекты.


Дата добавления: 2020-11-29; просмотров: 86; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!