Другая интересная особенность цикла for состоит в том, что его секции могут быть вообще пустыми, присутствие в них какого-либо выражения не обязательно.

Каждая из трех секций оператора for может быть любым синтаксически правильным выражением.

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

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

void sign_on(void){ char str[20]; int x; for(x=0; x<3 && strcmp(str, "password"); ++x) { printf("Пожалуйста, введите пароль:"); gets(str); } if(x==3) return; /* Иначе пользователь допускается */ . . . . }

Функция sign_on() использует стандартную библиотечную функцию strcmp(), которая сравнивает две строки и возвращает 0, если они совпадают.

Следует помнить, что

Эти выражения не всегда каким-либо образом отображают назначение секции. Рассмотрим следующий пример:

#include <stdio.h> int sqrnum(int num);int readnum(void);int prompt(void); int main(void){ int t; for(prompt(); t=readnum(); prompt()) sqrnum(t); return 0;} int prompt(void) { printf("Введите число: "); return 0;} int readnum(void){ int t; scanf("%d", &t); return t;} int sqrnum(int num){ printf("%d\n", num*num); return num*num;}

 

Здесь в main() каждая секция цикла for состоит из вызовов функций, которые предлагают пользователю ввести число и считывают его. Если пользователь ввел 0, то цикл прекращается, потому что тогда условие цикла принимает значение ЛОЖЬ. В противном случае число возводится в квадрат. Таким образом, в этом примере цикла for секции инициализации и приращения используются весьма необычно, но совершенно правильно.

В следующем примере цикл выполняется, пока пользователь не введет число 123:

for(x=0; x!=123; ) scanf("%d", &x);

Секция приращения оператора for здесь оставлена пустой. Это значит, что перед каждой итерацией значение переменной х проверяется на неравенство числу 123, а приращения не происходит, оно здесь ненужно. Если с клавиатуры ввести число 123, то условие принимает значение ЛОЖЬ и программа выходит из цикла.

Инициализацию параметра цикла for можно сделать за пределами этого цикла, но, конечно, до него. Это особенно уместно, если начальное значение параметра цикла вычисляется достаточно сложно, например:

gets(s); /* читает строку в s */if(*s) x = strlen(s); /* вычисление длины строки */else x = 10; for( ; x<10; ) { printf("%d", x); ++x;}

В этом примере секция инициализации оставлена пустой, а переменная х инициализируется до входа в цикл.