Оператор цикла for
Оператор for - это наиболее общий способ организации цикла. Он имеет следующий формат:
"for (" Выражение1';' Выражение2';' Выражение3 ')' Тело цикла';'
Выражение1 обычно используется для задания начального значения переменных, управляющих циклом. Выражение2 определяет условие, при котором тело цикла будет выполняться. Выражение3 выполняется после каждого прохода тела цикла (после каждой итерации). Обычно в выраженииз изменяются переменные, управляющие циклом.
Последовательность выполнения оператора цикла for:
1) Вычисялется Выражение 1;
2) Вычисялется Выражение2;
3) если значение Выражение2 отлично от нуля, то выполняется тело цикла, вычисляется Выражение3 и осуществляется переход к пункту 2, если Выражение2 равно нулю, то управление передается на оператор, следующий за оператором for.
Обратите внимание, что проверка условия всегда выполняется в начале цикла. Это означает, что тело цикла может ни разу не выполниться, если условие выполнения оператора цикла сразу будет ложным.
Пример использования оператора цикла for:
int main ()
{int i,b;
for (i=1; i<10; i++)
b=i*i;
return 0;
}
В этом примере вычисляются квадраты чисел от 1 до 9.
Некоторые варианты применения оператора for повышают его возможности за счет использования сразу нескольких переменных, управляющих циклом.
Пример использования нескольких переменных в операторе цикла for:
int main()
{int top,bot;
char string (100), temp;
for(top=0, bot=100; top<bot; top++,bot--)
{temp=string[top];
string[bot]=temp;
}
}
В этом примере, реализующем запись строки символов в обратном порядке, для управления циклом используются две переменные top и bot.
Отметим, что на месте Выражения1 и Выражения3 здесь используются несколько выражений, записанных через запятую и выполняемых последовательно.
В этом же примере можно наглядно проследить за тем, как влияет выбор типа переменных на размер загрузочного файла. В приведенном примере для организации цикла использованы переменные типа int. В результате получился машинный код размером 59 байт. При замене типа этих же переменных на unsigned char размер кода сокращается до 41 байта. Эти же действия увеличивают быстродействие программы в полтора раза!
В микроконтроллерах оператор цикла for используется^для реализации бесконечного цикла, который необходим для непрерывной работы устройства. Организация такого цикла возможна при использовании пустого Выражения2. Иногда для реализации алгоритма работы устройства требуется при выполнении какого-либо условия выйти из бесконечного цикла. Для этого можно воспользоваться оператором break.
Пример реализации бесконечного цикла с возможностью выхода из него при помощи оператора for:
for (;;)
{ ...
... break;
...
}
Так как в языке программирования С присутствует пустой оператор, то и в качестве тела цикла оператора for также можно использовать пустой оператор. Такая форма оператора может быть использована для организации временных задержек или поиска.
Пример использования пустого оператора для поиска:
for(i=0;t[i]<10;i++);
В данном примере при завершении цикла переменная цикла i принимает значение номера первого элемента массива t, значение которого больше 10.
Оператор цикла while
Оператор while называется циклом с предусловием и имеет следующий формат:
"while ("Выражение')' Тело ';'
Этот оператор обычно приводит к более коротким и эффективным программам по сравнению с предыдущим оператором цикла, т. к. элементарно накладывается на машинные инструкции микроконтроллера.
В качестве выражения допускается использовать любое выражение языка С-51, а в качестве тела - любой оператор, в том числе пустой или составной операторы. Последовательность выполнения оператора while:
1) вычисляется Выражение;
2) если Выражение ложно, то выполнение оператора while заканчивается и выполняется следующий по порядку оператор. Если выражение истинно, то выполняется тело оператора while;
3) переход к пункту 1.
Оператор цикла вида
"for ("Выражение 1';' Выражение2';' Выражение3')' Тело ';'
может быть заменен оператором while следующим образом:
Выражение1;
"whilе ("Выражение2')'
'{' Тело
Выражение3;
'}'
Так же, как и при выполнении оператора цикла for, в операторе while вначале происходит проверка Выражения2. Поэтому оператор while удобно использовать в ситуациях, когда тело не всегда нужно выполнять.
Внутри операторов for и while можно использовать локальные переменные, которые должны быть объявлены с определением соответствующих типов.
Оператор цикла do-while
Оператор цикла do-whiie называется оператором цикла с проверкой условия после тела цикла и используется в тех случаях, когда необходимо выполнить тело цикла хотя бы один раз. Формат оператора do-whiie имеет следующий вид:
"do" Тело "while" '('Выражение");"
Схема выполнения оператора do-whiie:
1) выполняется тело цикла (которое может быть составным оператором);
2) вычисляется Выражение;
3) если Выражение ложно, то выполнение оператора do-whiie заканчивается и выполняется следующий по порядку оператор. Если Выражение истинно, то выполняется переход к пункту 1.
Чтобы прервать выполнение цикла до того, как условие станет ложным, можно использовать оператор break.
Операторы while и do-while могут быть вложенными.
Пример использования вложенных циклов:
int i,j,k;
...
i=0; j=0; k=0;
do {i++;
j--;
while(a[k]<i)k++;
}while(i<30&&j<-30);
Следует отметить, что приведенный пример использования оператора do-whiie не является образцом для подражания, т. к. использование операции && заставляет компилятор создавать достаточно сложную программу выполнения логического выражения. Использование для той же цели оператора break приводит к более длинному исходному тексту программы. При этом код программы получается более коротким и быстродействующим, т. к. в этом случае один оператор языка программирования С соответствует одной машинной команде микроконтроллера:
char i=0, j=0, k=0;
...
do{i++; j--;
while(a[k]<i)k++;
if(j>=-30)break;
}while(i<30);
Оператор continue
Оператор continue используется только внутри операторов цикла, но в отличие от break, осуществляется не выход из цикла, а переход к следующему циклу. Формат записи оператора continue:
"continue;"
Пример использования оператора continue:
int main()
{int a,b;
for (a=1,b=0; a<100; b+=a,a++)
{if (b%2) continue;
... /* обработка четных сумм */
}
return 0;
}
Когда сумма чисел от 1 до а становится нечетной, оператор continue передает управление на очередную итерацию цикла for, не выполняя операторы обработки четных сумм.
Оператор continue, как и оператор break, прерывает самый внутренний из объемлющих его циклов.