Цикл со счетчиком
Оператор цикла for
for(e1; e2; e3) s
является удобной сокращенной записью для цикла while вида
e1; while(e2) { s; e3; }
Выражение e1 служит для задания начальных условий выполнения цикла, выражение e2 обеспечивает проверку условия выхода из цикла, а выражение e3 модифицирует условия, заданные выражением e1. Любое из выражений e1, e2, e3 может быть опущено. Если опущено e2, то по умолчанию вместо него подставляется значение TRUE. Например, цикл for
for(;e2;) s;
с опущенными e1,e3 эквивалентен циклу
while(e2) s;
Цикл
for(;;) s;
со всеми опущенными выражениями эквивалентен циклу
while(TRUE) s;
т.е. эквивалентен бесконечному циклу. Такой цикл может быть прерван только явным выходом из него с помощью операторов break, goto, return, содержащихся в теле цикла s.
for(n=10; n>0; n--) printf("%d секунд!\n",n); printf("Пуск! \n");
for (n=2; n<60;n=n+13); printf("%d\n",n);
for(ch = 'a';ch<='z';ch++) printf("Величина кода ASCII для %с равна %d.\n",ch,ch);
При выполнении этого оператора будут выведены на печать все буквы от а до z вместе с их кодами ASCII. Этот оператор работает, поскольку символы в памяти машины размещаются в виде чисел, и потому в данном фрагменте ведется счет с использованием целых чисел.
/* таблица кубов */ main( ) { int num; for(num=1; num<=6; num++) printf("%5d %5d\n", num,num*num*num); }
А теперь заменим спецификацию
for(num=1; num<=6; num++)
на
for(num=1; num<6; num++)
Это было бы целесообразно в случае, если бы нас больше занимало ограничение максимального значения диапазона кубов чисел, а не количество итераций.
for(x=100.0; x<150.0; x=x*1.1) printf("Ваш долг теперь %3.2f.\n",x);
В этом фрагменте программы значение переменной x умножается на 1.1 на каждом шаге цикла, что увеличивает ее на 10%. Результат выглядит следующим образом:
Ваш долг теперь 100.00. Ваш долг теперь 110.00. Ваш долг теперь 121.00. Ваш долг теперь 133.10. Ваш долг теперь 146.41.
for (x=y=1; y<=75; y=5*x++) printf("%10d %10d\n",x,y);
Обратите внимание, что в спецификации цикла проверяется значение y, а не x. В каждом из трех выражений, управляющих работой цикла for, могут использоваться любые переменные.
! | Хотя этот пример и правильный, он не может служить иллюстрацией хорошего стиля программирования. Программа выглядела бы гораздо понятнее, если бы мы не смешали процесс изменения переменной цикла с алгебраическими вычислениями. |
for(;;) { ... }
будет выполняться бесконечное число раз, поскольку пустое условие всегда считается истинным.
for(printf("Запоминайте числа! \n"); num != 6;) scanf("%d",&num); printf("Это как раз то, что я хочу!\n");
В этом фрагменте первое сообщение оказывается выведенным на печать один раз, а затем осуществляется прием вводимых чисел до тех пор, пока не поступит число 6.
for(n=1; n<1000; n+t)
И если после нескольких итераций наша программа решает, что величина t слишком мала или велика, то оператор if внутри цикла может изменить значение параметра. В диалоговой программе пользователь может изменить этот параметр в процессе выполнения цикла.
Подведем итоги. В операторе for используются три выражения, управляющие работой цикла. Они разделены символом "точка с запятой". Инициализирующее выражение вычисляется только один раз до начала выполнения какого-нибудь из операторов цикла. Если проверяемое выражение оказывается истинным, или не равным нулю, тело цикла выполняется один раз. Затем вычисляется величина корректируемого выражения, и значение проверяемого выражения определяется вновь. Оператор for - это цикл с предусловием. Решение о том, выполнить ли в очередной раз тело цикла или нет, принимается до начала его прохождения. Поэтому может случиться так, что тело цикла не будет выполнено ни разу. Оператор, образующий тело цикла, может быть как простым, так и составным.
Операция "запятая" увеличивает гибкость использования цикла for, позволяя включить в его спецификацию несколько инициализирующих или корректирующих выражений.