Бывает, что break
используется для выхода из цикла в тех случаях, когда заданы два разных условия прекращения его работы. Ниже приводится цикл, реализующий эхо-печать символов и завершающийся при чтении либо признака EOF, либо символа "новая строка":Мы сделаем логику этого фрагмента программы более понятной, если объединим обе проверки в одном выражении:
Если вы обнаружите, что break
является частью оператора if, посмотрите, нельзя ли по-другому выразить это условие (как мы только что сделали), чтобы необходимость его использования отпала.continue:
Этот оператор может использоваться во всех трех типах циклов, но не в операторе switch
. Как и в случае оператора break, он приводит к изменению характера выполнения программы. Однако вместо завершения работы цикла наличие оператора continue вызывает пропуск "оставшейся" части итерации и переход к началу следующей. Заменим оператор break в последнем фрагменте на continue:В версии, использующей оператор break
, работа цикла полностью прекращается, как только при вводе встречается символ "новая строка". В версии с оператором continue просто пропускаются символы "новая строка", а выход из цикла происходит, только когда читается признак EOF.Этот фрагмент, конечно, более компактно можно записать следующим образом:
Очень часто, так же как и в данном случае, изменение условия в операторе if
на обратное позволяет исключить необходимость введения в цикл оператора continue.С другой стороны, оператор continue
помогает иногда сократить некоторые программы, особенно если они включают в себя вложенные операторы if else.goto:
Оператор goto
- одно из важнейших средств Бейсика и Фортрана - также реализован и в Си. Однако на этом языке в отличие от двух других можно программировать, совершенно не используя указанное средство. Керниган и Ритчи считают оператор goto "чрезвычайно плохим" средством и предлагают "применять его как можно реже или не применять совсем".Сначала мы покажем, как его использовать, а затем объясним, почему этого нe нужно делать.
Оператор goto
состоит из двух частей - ключевого слова goto и имени метки. Имена меток образуются по тем же правилам, что и имена переменных. Приведем пример записи оператораЧтобы этот оператор выполнился правильно, необходимо наличие другого оператора, имеющего метку part2;
в этом случае запись оператора начинается с метки, за которой следует двоеточие.Избегайте использовать goto
В принципе вы никогда не обязаны пользоваться оператором goto
при программировании на Си. Но если ваш предыдущий опыт связан с работой на Фортране или Бейсике, в каждом из которых требуется его использовать, то у вас могли выработаться навыки программирования, основанные на применении данного оператора. Чтобы помочь вам преодолеть эту привычку, ниже вкратце приводится несколько знакомых вам ситуации, реализуемых с помощью goto, а затем показывается, как это можно осуществить другими средствами, в большей степени соответствующими духу языка Си.1. Работа в ситуации, когда в операторе if
требуется выполнить более одного оператора:(В стандартных Бейсике и Фортране только один оператор, непосредственно следующий за if
-условием, считается относящимся к оператору if. Мы выразим это с помощью эквивалентного фрагмента на Си.)Обычный подход, применяемый в языке Си и заключающийся в использовании составного оператора, или блока, упрощает понимание смысла программы:
2. Осуществление выбора из двух вариантов:
Наличие в языке Си структуры if-else
позволяет реализовать такой выбор более наглядно:3. Реализация бесконечного цикла: