Оператор for 1
Оператор циклу for має наступний формат запису:
for (init_expression; loop_condition; loop_expression) program statement;
Три вираження, укладені в круглі дужки оператора циклу for, задають умови виконання програмного циклу.
Перший параметр init_expression використовується для завдання початкового значення циклу (для завдання початкових умов виконання циклу)
Другий компонент loop_condition визначає умова або умови, відповідно до яких буде відбуватися вихід з циклу. Повторення буде відбуватися до тих пір, поки ця умова (або умови) виконуються. Якщо умова не виконується, то цикл негайно закінчується.
Третій параметр loop_expression виконується кожен раз, коли закінчується обробка тіла циклу, тобто program statement (вираз loop_expression модифікує умови, задані виразом init_expression).
Найчастіше вираження init_expression і loop_expression є операторами присвоювання або викликами функцій, а другий вираз loop_condition - виразом відносини або логічним виразом.
Будь-яку з трьох частин можна опустити, але точки з запитом повинні залишитися на своїх місцях. Якщо опустити init_expression або loop_expression, то відповідні операції не виконуватимуться. Якщо ж опустити перевірку умови loop_condition, то за замовчуванням вважається, що умова продовження циклу завжди істинно, і тоді цикл стане нескінченним (відбудеться зациклення). тобто якщо опущено loop_condition, то за замовчуванням замість нього підставляється значення TRUE.
Там, де необхідно виконання декількох тверджень, то вони повинні полягати в фігурні дужки, тобто в блок:
У наведеному випадку тіло циклу знаходиться в фігурних дужках.
Конструкція циклу, реалізована оператором for, може бути виконана також і оператором while наступним чином:
Винятком є застосування операції continue.
Ціклfor (; loop_condition;) program statement;
з опущеними init_expression, loop_expression еквівалентний циклу
while (loop_condition) program statement;
з усіма опущеними виразами еквівалентний циклу
while (TRUE) program statement;
тобто еквівалентний нескінченного циклу. Такий цикл може бути перерваний тільки явним виходом з нього за допомогою операторів break, goto, return, що містяться в тілі циклу program statement.
Оператори відносини перераховані в табл. 6.1.
більше або дорівнює
У програмах мови С можливо застосовувати вкладені цикли, кожен з яких контролюється своєї змінної циклу і своїм ставленням (другий вираз в круглих дужках оператора for). Вкладені цикли можуть йти безпосередньо один за одним або складати тіло циклу за допомогою фігурних дужок. Можливо також використання двох індексних змінних для ініціалізації початку циклу з подальшим їх инкрементирование (збільшенням) або декрементірованіем (зменшенням).
Незважаючи на зовнішню схожість з ітеративними циклами for мов Паскаль і Ада або ітеративними циклами do мов Фортран або ПЛ / 1, цикл for мови Сі не є їх семантичної копією. Цикл for мови Сі має більшу спільністю, ніж цикли for і do інших мов. На відміну від цих циклів, в загальному випадку число ітерацій в циклі for мови Сі не може бути визначено до виконання цього циклу.
Цикл for і його альтернатива цикл while семантично майже еквівалентні, але, як вказується в роботі (Ritchie, D.M. 1980. The Programming Language - Reference Manual /. ATT Bell Laboratories, Murray Hill, N.J. 07974), не ідентичні. Наприклад, розглянемо випадок, коли оператор program statement є оператором continue або складеним оператором, що містить оператор continue. Дія оператора continue полягає в переході до кінця циклу, що має різні наслідки для циклу for і його еквівалента у формі циклу while. У випадку з циклом for вираз loop_expression виконується до обчислення значення виразу loop_condition, в той час як в еквівалентному циклі while вираз loop_expression пропускається.
Гнучкість конструкції for - наслідок способу використання виразів в специфікації циклу. Існує багато можливостей застосування циклу for, деякі з яких ми наведемо нижче.
- Можна застосовувати операцію збільшення для рахунку в порядку зростання:
- Можна застосовувати операцію зменшення для рахунку в порядку убування замість рахунку в порядку зростання:
- При бажанні можна вести рахунок двійками, десятками і т.д .:
- Можна вести підрахунок за допомогою символів, а не тільки чисел:
При виконанні цього оператора будуть виведені на друк всі букви від а до z разом з їх кодами ASCII. Цей оператор працює, оскільки символи в пам'яті машини розміщуються в вигляді чисел, і тому в даному фрагменті ведеться рахунок з використанням цілих чисел.
- Можна перевірити виконання деякого довільного умови, відмінного від умови, що накладається на число ітерацій. Розглянемо приклад в програмі друкує таблицю кубів цілих чисел:
А тепер замінимо специфікацію
for (num = 1; num<=6; num++)
for (num = 1; num<6; num++)
Це було б доцільно в разі, якби нас більше займало обмеження максимального значення діапазону кубів чисел, а не кількість ітерацій.
- Можна зробити так, щоб значення деякої величини зростала в геометричній, а не в арифметичній прогресії, тобто замість додавання фіксованого значення на кожному кроці циклу виконувалося б множення:
У цьому фрагменті програми значення змінної x множиться на 1.1 на кожному кроці циклу, що збільшує її на 10%. Результат виглядає наступним чином:
Ваш борг тепер 100.00.Ваш борг тепер 110.00.Ваш борг тепер 121.00.Ваш борг тепер 133.10.Ваш борг тепер 146.41.- В якості третьої вираження можна використовувати будь-який правильно складене вираз. Яке б вираз ми ні вказали, його значення буде змінюватися при кожній ітерації:
Зверніть увагу, що в специфікації циклу перевіряється значення y, а не x. У кожному з трьох виразів, які керують роботою циклу for, можуть використовуватися будь-які змінні.
Хоча цей приклад і правильний, він не може служити ілюстрацією хорошого стилю програмування. Програма виглядала б набагато зрозуміліше, якби ми не змішали процес зміни змінної циклу з алгебраїчними обчисленнями.
- Можна навіть опустити одне або більше виразів, але при цьому не можна опустити символи "крапка з комою". тіло циклу
буде виконуватися нескінченну кількість разів, оскільки пусте умова завжди вважається дійсним.
- Перший вираз не обов'язково має ініціювати змінну. Замість цього, наприклад, там міг би стояти оператор printf (). Необхідно пам'ятати тільки, що перший вираз обчислюється тільки один раз перед тим, як інші частини циклу почнуть виконуватися.
У цьому фрагменті перше повідомлення виявляється виведеним на друк один раз, а потім здійснюється прийом чисел, що вводяться до тих пір, поки не надійде число 6.
- Параметри, що входять до виразу, що знаходяться в специфікації циклу, можна змінити при виконанні операцій в тілі циклу. Припустимо, наприклад, що у вас є цикл зі специфікацією такого вигляду:
І якщо після декількох ітерацій наша програма вирішує, що величина t занадто мала або велика, то оператор if всередині циклу може змінити значення параметра. У діалогової програми користувач може змінити цей параметр в процесі виконання циклу.
Підведемо підсумки. В операторі for використовуються три вирази, що керують роботою циклу. Вони розділені символом "крапка з комою". Инициализирующее вираз обчислюється тільки один раз до початку виконання якого-небудь з операторів циклу. Якщо перевіряється вираз виявляється істинним, або не рівним нулю, тіло циклу виконується один раз. Потім обчислюється величина корректируемого вираження, і значення перевіряється виразу визначається знову. Оператор for - це цикл з передумовою. Рішення про те, чи виконати в черговий раз тіло циклу чи ні, приймається до початку його проходження. Тому може статися так, що тіло циклу не буде виконано жодного разу. Оператор, який утворює тіло циклу, може бути як простим, так і складеним.
Операція "кома" збільшує гнучкість використання циклу for, дозволяючи включити в його специфікацію кілька ініціюючих або коригувальних виразів.