Язык Си - руководство для начинающих
Шрифт:
continue:
Этот оператор может использоваться во всех трех типах циклов, но не в операторе switch. Как и в случае оператора break, он приводит к изменению характера выполнения программы. Однако вместо завершения работы цикла наличие оператора continue вызывает пропуск "оставшейся" части итерации и переход к началу следующей. Заменим оператор break в последнем фрагменте на continue:
while((ch = getchar)!==EOF)
{
if(ch == '\n')
continue;
putchar(ch);
}
Этот фрагмент, конечно, более компактно можно записать следующим образом:
while((ch=getchar)!= EOF)
if(ch != '\n') putchar(ch);
Очень часто, так же как и в данном случае, изменение условия в операторе if на обратное позволяет исключить необходимость введения в цикл оператора continue.
С другой стороны, оператор continue помогает иногда сократить некоторые программы, особенно если они включают в себя вложенные операторы if else.
goto:
Оператор goto– одно из важнейших средств Бейсика и Фортрана - также реализован и в Си. Однако на этом языке в отличие от двух других можно программировать, совершенно не используя указанное средство. Керниган и Ритчи считают оператор goto "чрезвычайно плохим" средством и предлагают "применять его как можно реже или не применять совсем".
Сначала мы покажем, как его использовать, а затем объясним, почему этого нe нужно делать.
Оператор goto состоит из двух частей - ключевого слова goto и имени метки. Имена меток образуются по тем же правилам, что и имена переменных. Приведем пример записи оператора
goto pait2;
Чтобы этот оператор выполнился правильно, необходимо наличие другого оператора, имеющего метку part2; в этом случае запись оператора начинается с метки, за которой следует двоеточие.
part2: printf(" Уточненный анализ:\n");
Избегайте использовать goto
В принципе вы никогда не обязаны пользоваться оператором goto при программировании на Си. Но если ваш предыдущий опыт связан с работой на Фортране или Бейсике, в каждом из которых требуется его использовать,
1. Работа в ситуации, когда в операторе if требуется выполнить более одного оператора:
if(size > 12)
goto a;
goto b;
a: cost = cost * 1.05;
flag = 2;
b: bill = cost * flag;
(В стандартных Бейсике и Фортране только один оператор, непосредственно следующий за if– условием, считается относящимся к оператору if. Мы выразим это с помощью эквивалентного фрагмента на Си.)
Обычный подход, применяемый в языке Си и заключающийся в использовании составного оператора, или блока, упрощает понимание смысла программы:
if(size > 12);
{
cost = cost * 1.05;
flag = 2;
}
bill = cost * flag;
2. Осуществление выбора из двух вариантов:
if(size > 14) goto a;
sheds = 2;
goto b;
a: sheds = 3;
b: help = 2 * sheds;
Наличие в языке Си структуры if-else позволяет реализовать такой выбор более наглядно:
if(ibex > 14)
sheds = 3;
else
sheds = 2;
help = 2 * sheds;
3. Реализация бесконечного цикла:
readin: scanf(" %d", &score);
if(score < 0) goto stagc2;
большое количество операторов;
goto readin:
stagc2: дополнительная чепуха;
}
Эквивалентный фрагмент, в котором используется цикл while, выглядит так:
scanf(" %d", &score);
whilet(score >= 0)