CFA LogoCFA Logo Computer
Новости Статьи Магазин Драйвера Контакты
Новости
RSS канал новостей
В конце марта компания ASRock анонсировала фирменную линейку графических ускорителей Phantom Gaming. ...
Компания Huawei продолжает заниматься расширением фирменной линейки смартфонов Y Series. Очередное ...
Компания Antec в своем очередном пресс-релизе анонсировала поставки фирменной серии блоков питания ...
Компания Thermalright отчиталась о готовности нового высокопроизводительного процессорного кулера ...
Компания Biostar сообщает в официальном пресс-релизе о готовности флагманской материнской платы ...
Самое интересное
Программаторы 25 SPI FLASH Адаптеры Optibay HDD Caddy Драйвера nVidia GeForce Драйвера AMD Radeon HD Игры на DVD Сравнение видеокарт Сравнение процессоров

АРХИВ СТАТЕЙ ЖУРНАЛА «МОЙ КОМПЬЮТЕР» ЗА 2003 ГОД

Язык, на котором говорят везде

Тихон ТАРНАВСКИЙ tarnav@bigmir.net

Продолжение, начало см. в МК 1-3, 5, 7, 9, 11, 14 (224-226, 228, 230, 232, 234, 237).
Привет всем идущим в страну Си. А если вы еще не идете — присоединяйтесь. За два предыдущих перехода мы прошли оба сишных ветвления (if-else и switch) и цикл for. Теперь движемся дальше.

12. Меж собою так похожи Соколовы-братья...

Следующие два цикла, те, которые не то два, не то один (см. последний абзац предыдущего выпуска), — это циклы while («пока», не в смысле «до свиданья», а в смысле «до тех пор, пока»). Эти циклы выполняются, пока верно заданное условие, и отличаются друг от друга только тем, что в одном из них условие проверяется в начале (до тела цикла), а в другом — в конце (соответственно, после). За это их в некоторых книжках кличут «циклом с предусловием» и «циклом с постусловием». (Один мой знакомый, учивший язык по такой книжке, потом упорно называл первый из этих двоих «циклом с предисловием».)

Конструкция у них такая:

Поэтому в других, менее косноязычных книжках их называют «цикл while» и «цикл do-while».

Перечисленные три варианта цикла (for, while и do-while) можно, конечно, все позаменять любым одним из них (с добавлением других операторов), как и делалось, к примеру, в ранних бейсиках (не Visual и не Turbo и даже не gw, а просто бейсиках) — там был только цикл for, причем очень урезанный. Но когда есть все три, то многое пишется значительно проще (не столько в смысле сложности написания, сколько по конструкции итогового исходника) — они вкупе дают уже достаточную свободу, пожалуй, для любых повторений, которые вы только сможете выдумать. Посему эти трое уже стали классикой — их, вслед за сями, включили в себя многие другие популярные языки. А Си во всем множестве широко используемых ныне языков, без сомнения, первенец; в той же незабвенной книге Кернигана-Ричи (тогда этот язык был еще очень молод) среди языков, с которыми его сравнивают, если и попадаются знакомые названия, то они знакомы скорее по исторической литературе.

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

Пример первый:

Пример второй:

Ну вот, у нас уже есть все циклы. Теперь вернемся к оператору «бряк», о котором шла речь в прошлый раз. Помните (если, конечно, читали предыдущий выпуск), я писал, что этот оператор позволяет вываливаться не только из переключателя, но и из циклов? Поступает он с ними точно таким же образом — передает управление следующему после тела цикла оператору. А еще, если помните, я писал об операторе перехода, что единственный случай, где его, может быть, есть резон использовать, — это когда надо вывалиться из вложенных циклов. Дело в том, что если вы, к примеру, напишете вот так:

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

Все те же Керниган и Ричи написали во все той же книге, что тут на самом деле тоже можно обойтись без goto, но предложили какое-то не очень красивое альтернативное решение с дополнительной переменной и несколькими лишними ветвлениями. Этот вариант я здесь даже не буду приводить — мне кажется, что он не лучше, чем с переходом, а интересующихся могу отослать к упомянутой книге (раздел 3.9). Я же сейчас предложу вам свой вариант, основанный на превращении двух вложенных циклов в один. На первый взгляд это, правда, может показаться ужасным, но все же взгляните:

Здесь сначала обе переменные сразу инициализируются нулем, а вся галиматья начинается уже в шаге цикла. Расшифровываю. Сначала j увеличивается на единицу; здесь же проверяется, не достигло ли оно еще своего максимума, и здесь же результат этого сравнения прибавляется к i. То есть, i увеличится на единицу только тогда, когда j достигнет максимума. Запятая — это на самом деле еще один оператор, который означает просто последовательное выполнение действий. А вторым из этих действий будет умножение j на результат сравнения его же с максимумом; таким образом, как только переменная j достигнет максимума, она тут же обнулится (опять же, если вы выяснили, что правда у вас равна -1, то поменяйте соответствующие знаки). В результате — никаких вложенных циклов, и можем запросто использовать «бряк». Правда, думаю, кому-то такое решение наверняка покажется менее читабельным, чем вариант с goto (хотя мне чем-то нравится). Но главное, как и всегда в Си, что альтернатива есть, — какой способ хотите, такой и используйте. И альтернатива эта, конечно, не единственная: можно еще, к примеру, загнать проверку условия в заголовок внутреннего цикла — и обойтись, таким образом, вообще без бряка.

13. «Продолжаем разговор...»

Но для циклов упомянутый «бряк» — не единственный способ нарушить нормальный ход вещей. Есть еще оператор continue (продолжить). И если break полностью прерывает выполнение цикла, то continue прекращает только текущий его «проход», то есть управление передается не на следующий оператор после тела цикла, а на заголовок текущего цикла. Пример: хотите вы сделать что-то одно и то же самое со всеми подряд числами, кроме, скажем, трех (ну например, если нужно в теле цикла чего-нибудь делить на i-3). Пишем так:

Вообще-то можно было и так написать:

Но скоро мы займемся более сложными (в смысле, более функциональными) примерами, и тогда этот продолжитель нам оченно даже пригодится. А чтобы мы смогли действительно более функционально использовать циклы, в следующий раз перейдем к первому составному типу данных —массивам. Так что до следующей встречи...

Рекомендуем ещё прочитать:






Данную страницу никто не комментировал. Вы можете стать первым.

Ваше имя:
Ваша почта:

RSS
Комментарий:
Введите символы или вычислите пример: *
captcha
Обновить





Хостинг на серверах в Украине, США и Германии. © sector.biz.ua 2006-2015 design by Vadim Popov