Синтаксис:
goto < метка >;
.
.
.
< метка >: < оператор >
Действие:
Оператор перехода gotoпередает управление непосредственно на < оператор >, помеченный < меткой >. Метка представляет собой обычный идентификатор, синтаксис которого описан в разделе 1.3. Область действия метки ограничивается функцией, в которой она определена; из этого следует, во-первых, что каждая метка должна быть отлична от других меток в той же самой функции; во-вторых, что нельзя передать управление по оператору gotoв другую функцию.
Помеченный оператор выполняется сразу после выполнения оператора goto. Если оператор с данной меткой отсутствует или существует более одного оператора, помеченного той же меткой, то компилятор сообщает об ошибке. Метка оператора имеет смысл только для оператора goto. При последовательном выполнении операторов помеченный оператор выполняется так же, как если бы он не имел метки.
Можно войти в блок, тело цикла, условный оператор, оператор-переключатель по метке.
Нельзя с помощью оператора gotoпередать управление на конструкции caseи defaultв теле переключателя.
Пример:
if(errorcode >0) goto exit;
…
exit: return (errorcode);
В примере оператор перехода gotoпередает управление на оператор, помеченный меткой exit, если errorcodeбольше нуля.
Синтаксис:
return [< выражение >];
Действие:
Оператор возврата returnзаканчивает выполнение функции, в которой он содержится, и возвращает управление в вызывающую функцию. Управление передается в точку вызывающей функции, непосредственно следующую за оператором вызова. Значение < выражения >, если оно задано, вычисляется, приводится к типу, объявленному для функции, содержащей оператор возврата return, и возвращается в вызывающую функцию. Если < выражение > опущено, то возвращаемое функцией значение не определено.
Пример:
main()
{
void draw(int, int);
long sq(int);
у = sq(x);
draw(x, y);
}
long sq(int x)
{
return (x*x);
}
void draw(int x, int y)
{
return,
}
Функция mainвызывает две функции, sqи draw.Функция sqвозвращает значение квадрата x. Это значение присваивается переменной у. Функция drawобъявлена с типом void, как не возвращающая значения. Попытка присвоить значение. возвращаемое функцией draw, привело бы к сообщению компилятора об ошибке.
< Выражение > в операторе возврата returnпринято заключать в скобки, как показано в примере. Это, однако, не является требованием языка.
Если оператор returnотсутствует в теле функции, то управление автоматически передается в вызывающую функцию после выполнения последнего оператора в вызванной функции, т. е. по достижении последней закрывающей фигурной скобки. Возвращаемое значение вызванной функции в этом случае не определено. Если возвращаемое значение не требуется, то функцию следует явно объявлять с типом void.
Распространенной ошибкой является наличие в функции, которая должна возвращать значение, операторов возврата, как с выражением, так и без него.
Функция — это совокупность объявлений и операторов, предназначенная для выполнения некоторой отдельной задачи. Количество функций в программе не ограничивается. Любая программа на языке Си содержит, по крайней мере, одну функцию, так называемую главную функцию, с именем main. В данном разделе описывается, как определять, объявлять и вызывать функции в языке Си.
Определение функции специфицирует имя функции, атрибуты ее формальных параметров, и тело функции, содержащее Объявления и операторы. В определении функции также может задаваться класс памяти функции и тип возвращаемого значения.
Объявление функции задает имя и тип возвращаемого значения функции, явное определение которой приведено в другом месте программы. В объявлении функции могут быть также специфицированы класс памяти, число аргументов функции и их типы. Прототип функции (версия 5.0 СП MSC и СП ГГС) позволяет, помимо того, задавать в объявлении идентификаторы и класс памяти аргументов. Это позволяет компилятору сравнивать при вызове типы фактических аргументов и формальных параметров функции.
Читать дальше