Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
http.doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
1.34 Mб
Скачать

Метки и goto

Хотя goto уже давно не рекомендуют использовать, он по-прежнему используется в программах. Мы не будем рассматривать целесообразность его использования с точки зрения элегантности управления программой. Следует заметить, что не существует таких ситуаций, где он был бы единственным решением. Общепринято, что он может быть полезен в некоторых ситуациях, goto используется довольно редко. (В языках типа С, имеющих богатый набор структур управления и предоставляющих дополнительные элементы управления типа break и continue, в нем нет необходимости.) Большинство программистов знают, что goto может легко запутать программу и сделать ее практически нечитабельной. Тем не менее, бывают моменты, когда goto не только не усложняет программу, но даже ее упрощает.

goto требует наличия меток для работы. Метка - это корректный идентификатор С, завершаемый двоеточием. Метка должна находиться в той же функции, что и goto. Например, цикл от 1 до 100 может быть записан с использованием goto и меток следующим образом: х = 1; loop1: х++; if (х < 100) goto loop1;

Одним из хороших способов использования goto является выход из нескольких уровней вложения. Например: for(...) { for (...) { while (...) { if (...) goto stop; ... } } } printf("error in program\n"); Уничтожение goto приведет к необходимости выполнения дополнительных проверок. Простой оператор break здесь не работает, поскольку он может выйти только из самого нижнего цикла.

Если проверяется каждый цикл, то код будет выглядеть следующим образом: done = 0; for(...) { for(...) { while (...) { if (...) { done = 1; break; } ... if(done) break; } if(done) break; }

Следует использовать goto как можно реже. Но если без него код трудно читать или критична cкорость работы программы, то использование goto может быть наилучшим выходом.

Функции

Функции - это базовые блоки С, в которых выполняются все операции. Стандартный вид функций следующий: спецификатор_типа имя_функции (список параметров) { тело функции } Спецификатор_типа определяет тип возвращаемого функцией значения с помощью оператора return. Это может быть любой допустимый тип. Если тип не указан, предполагается, что функция возвращает целочисленные значения. Список параметров - это разделенный запятыми список переменных, получающий значение аргументов при вызове функции. Функция может быть без параметров и в таком случае список параметров содержит ключевое слово void.

Оператор return

Оператор return имеет два назначения. Во-первых, немедленный выход из функции. То есть он осуществляет выход в вызывавший функцию код. Во-вторых, может использоваться для возврата значения. Здесь рассмотрены оба назначения.

Выход из функции

Имеется два способа окончания работы функции и передачи управления вызывающему коду. Первый способ предполагает достижение последнего оператора функции, после чего работа функции заканчивается при встрече }. (Конечно, фигурной скобки на самом деле нет в объектном коде, но никто не мешает нам так думать.) Например, следующая функция выводит на экран строку: void pr_reverse(char *s) { register int t; for(t=strlen(s) -1; t > -1; t-) printf ("%c", s [t]); } После отображения строки функция ничего не делает, поэтому управление передается вызвавшему ее коду.

Тем не менее, не многие функции используют данный метод окончания своего выполнения. Большинство функций используют оператор return для окончания выполнения с целью возврата значения или упрощения кода функции и увеличения его эффективности путем создания нескольких точек выхода. Важно запомнить, что функция может иметь несколько операторов return. Например, функция, показанная ниже, возвращает или индекс первого появления подстроки, указываемой в s1, в строке, указываемой в s2, или —1, если не обнаружено совпадений: int find_substr (char *s1, char *s2) { register int t; char *p, *p2; for(t=0; s1[t]; t++) { p = &s1[t]; p2 = s2; while (*p2 && *p2==*p) { p++; p2++; } if(!*p2) return t; } return -1; }

Надо обратить внимание, как два оператора return упрощают функцию.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]