Инструкции перехода осуществляют безусловную передачу управления.
инструкция-перехода
: goto идентификатор
; continue ;
break ;
return выражениенеоб
;В goto
-инструкции идентификатор должен быть меткой (A9.1), расположенной в текущей функции. Управление передается на помеченную инструкцию.Инструкцию continue
можно располагать только внутри цикла. Она вызывает переход к следующей итерации самого внутреннего содержащего ее цикла. Говоря более точно, для каждой из конструкций while (...){
...
contin: ;
}
do {
...
contin: ;
} while (...);
for (...){
...
contin: ;
}
инструкция continue
, если она не помещена в еще более внутренний цикл, делает то же самое, что и goto contin.Инструкция break
встречается в циклической или в switch-инструкции, и только в них. Она завершает работу самой внутренней циклической или switch- инструкции, содержащей данную инструкцию break, после чего управление переходит к следующей инструкции.С помощью return
функция возвращает управление в программу, откуда была вызвана. Если за return следует выражение, то его значение возвращается вызвавшей эту функцию программе. Значение выражения приводится к типу так, как если бы оно присваивалось переменной, имеющей тот же тип, что и функция.Ситуация, когда "путь" вычислений приводит в конец функции (т. е. на последнюю закрывающую фигурную скобку), равносильна выполнению return
- инструкции без выражения. При этом, а также в случае явного задания return без выражения возвращаемое значение не определеноА10. Внешние объявления
То, что подготовлено в качестве ввода для Си-компилятора, называется единицей трансляции. Она состоит из последовательности внешних объявлений, каждое из которых представляет собой либо объявление, либо определение функции.
единица-трансляции
: внешнее-объявление
единица-трансляции внешнее-объявление
внешнее-объявление
: определение-функции
объявление
Область видимости внешних объявлений простирается до конца единицы трансляции, в которой они объявлены, точно так же, как область видимости объявлений в блоке распространяется до конца этого блока. Синтаксис внешнего объявления не отличается от синтаксиса любого другого объявления за одним исключением: код функции можно определять только с помощью внешнего объявления.
A10.1. Определение функции
Определение функции имеет следующий вид:
определение-функции
: спецификаторы-объявлениянеоб
объявитель список-объявленийнеоб составная-инструкция
Из спецификаторов класса памяти в спецификаторах-объявлениях возможны только extern
и static; различия между последними рассматриваются в A11.2.Типом возвращаемого функцией значения может быть арифметический тип, структура, объединение, указатель и void
, но не "функция" и не "массив". Объявитель в объявлении функции должен явно указывать на то, что описываемый им идентификатор имеет тип "функция", т. е. он должен иметь одну из следующих двух форм (A8.6.3):собственно-объявитель
( список-типов-параметров )собственно-объявитель
( список-идентификаторовнеоб ) где собственно-объявитель
есть идентификатор или идентификатор, заключенный в скобки. Заметим, что тип "функция" посредством typedef получить нельзя.Первая форма соответствует определению функции новым способом, для которого характерно объявление параметров в списке-типов-параметров вместе с их типами; за объявителем не должно быть списка-объявлений. Если список-типов-параметров не состоит из одного-единственного слова void
, показывающего, что параметров у функции нет, то в каждом объявителе в списке-типов-параметров обязан присутствовать идентификатор. Если список-типов-параметров заканчивается знаками ", ...", то вызов функции может иметь аргументов больше, чем параметров; в таком случае, чтобы обращаться к дополнительным аргументам, следует пользоваться механизмом макроса va_arg из заголовочного файла , описанного в приложении B. Функции с переменным числом аргументов должны иметь по крайней мере один именованный параметр.Вторая форма - определение функции старым способом. Список-идентификаторов содержит имена параметров, а список-объявлений приписывает им типы. В списке- объявлении разрешено объявлять только именованные параметры, инициализация запрещается, и из спецификаторов класса памяти возможен только register
.