Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
PYaVU_s.doc
Скачиваний:
44
Добавлен:
24.02.2016
Размер:
665.09 Кб
Скачать
    1. Оператор return

Синтаксис:

return [<expression>];

Выполнение:

Оператор return заканчивает выполнение функции, в которой он появляется, и возвращает управление в вызывающую функцию. Управление передается в вызывающую функцию в точку, непосредственно следующую за вызовом. Значение выражения <expression>, если оно есть, возвращается в вызывающую функцию. Если выражение <expression> опущено, то возвращаемая функцией величина не определена.

Пример

main ()

{

void draw (int,int);

long sq (int);

.

.

.

y=sq (x);

draw (x,y);

.

.

.

}

long sq (x)

int x;

{

return (x*x);

}

void draw (x,y)

int x,y;

{

.

.

.

return;

}

Функция main вызывает две функции, sq и draw. Функция sq возвращает значение x*x в main. Величина возврата присваивается переменной y. Функция draw объявляется как функция void и не возвращает значения. Попытка присвоить возвращаемое значение функции draw привело бы к ошибке.

Выражение <expression> оператора return заключено в скобки, как показано в примере. Язык не требует скобок.

Отсутствие оператора return

Если оператор return не появился в определении функции, то управление автоматически передается в вызывающую функцию после выполнения последнего оператора в вызванной функции. Значение возврата вызванной функции при этом не определено. Если значение возврата не требуется, то функция должна быть объявлена с типом возврата void.

    1. Оператор switch

Синтаксис:

switch (<expression>)

{

[<declaration>]

.

.

.

[case <constant-expression>:]

.

.

.

[<statement>]

.

.

.

break;

[case <constant-expression>:]

.

.

.

[<statement>]

.

.

.

[default:

<statement>]

}

Выполнение:

Оператор switch передает управление одному из операторов <statement> своего тела. Оператор, получающий управление, - это тот оператор, чье case-константное выражение <constant-expression> равно значению switch-выражения <expression> в круглых скобках.

Выполнение тела оператора начинается с выбранного оператора и продолжается до конца тела или до тех пор, пока очередной оператор <statement> передает управление за пределы тела.

Оператор default выполнится, если case-константное выражение <constant-expression> не равно значению switch-выражения <expression>. Если default-оператор опущен, а соответствующий case не найден, то выполняемый оператор в теле switch отсутствует. Switch-выражение <expression> - это целая величина размера int или короче. Оно может быть также величиной типа enum. Если <expression> короче чем int, оно расширяется до int.

Каждое case-константное выражение <cjnstant-expression> преобразуется к типу switch-выражения. Значение каждого case-константного выражения должно быть уникальным внутри тела оператора.

Case и default метки в теле оператора switch существенны только при начальной проверке, когда определяется стартовая точка для выполнения тела оператора. Все операторы появляющиеся между стартовым оператором и концом тела, выполняются, не обращая внимания на свои метки, если какой-то из операторов не передает управления из тела оператора switch.

В заголовке составного оператора, формирующего тело оператора switch, могут появиться объявления, но инициализаторы, включенные в объявления, не будут выполнены. Назначение оператора switch состоит в том, чтобы передать управление непосредственно на выполняемый оператор внутри тела, обойдя строки, которые содержат инициализацию.

Примеры:

/***.....* example 1 *.....***/

switch (c)

{

case 'A':

capa++;

case 'a':

lettera++;

default:

total++;

}

/***.....* example 2 *.....***/

switch (i)

{

case -1:

n++;

break;

case 0:

z++;

break;

case 1:

p++;

break;

}

В первом примере все три оператора в теле switch выполняются, если c равно 'A'. Передача управления осуществляется на первый оператор capa++, далее операторы выполняются в порядке их следования в теле.

Если c равно 'a', то переменные lettera и total инкрементируются. Наконец, если c не равно ни 'A' ни 'a', то инкрементируется только переменная total.

Во втором примере в теле switch после каждого оператора следует оператор break. Оператор break осуществляет принудительный выход из switch после выполнения одного из этих операторов. Последний оператор break не является обязательным, поскольку без него управление было бы передано из тела на конец составного оператора, но он включен для единообразия.

Множественные метки

Оператор тела switch может быть помечен множественными метками, как показано в нижеследующем примере:

case 'a':

case 'b':

case 'c':

case 'd':

case 'e':

case 'f': hexcvt (c);

Хотя любой оператор внутри тела оператора switch может быть помечен, однако не требуется оператора, чтобы появилась метка. Операторы без меток могут быть смешаны с помеченными операторами. Следует помнить, однако, что если switch оператор передал управление одному из операторов своего тела, то все следующие за ним операторы в блоке выполняются, не обращая внимания на свои метки.