Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Максимов_электронный_учебник_текст.doc
Скачиваний:
2
Добавлен:
12.11.2019
Размер:
3 Мб
Скачать
☆

4.4. Операторы передачи управления

К операторам передачи управления относят оператор безусловного перехода, иначе – оператор безусловной передачи управления ( goto), оператор возврата из функции (return), оператор выхода из цикла или переключателя ( break) и оператор перехода к следующей итерации цикла (continue).

Оператор безусловного перехода имеет вид

goto идентификатор;

где идентификатор – имя метки оператора, расположенного в той же функции, где используется оператор безусловного перехода.

Передача управления разрешена на любой помеченный оператор в теле функции. Однако существует одно важное ограничение: запрещено «перескакивать» через определение, содержащие инициализацию объектов. Это ограничение не распространяется на вложенные блоки, которые можно обходить целиком. Следующий фрагмент иллюстрирует сказанное:

…

goto B;/*Ошибка. Попытка «перескочить» через определение*/

float z = 0.0; // переменной z.

goto B; /*Ошибки нет. Определение переменной n находится внутри блока*/

{

int n = 10;

z = n*z+z;

}

B: Std::cout<<”\n x = “<<x; /*Строка, на которую передаётся управление.*/

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

Следующий фрагмент содержит обе указанные ошибки:

{… //Внешний блок

goto ABC; // Во внутренний блок, минуя описание ii

{

int ii = 15; //Внутрений блок

…

ABC:

…

goto XYZ; //Обход описания СС

char CC = ‘ ‘;

…

XYZ:

…

}

…

}

В принятом в настоящее время стиле программирования принято либо вовсе отказаться от оператора goto, либо свести его применение к минимуму и строго придерживаться следующих рекомендаций:

не входить внутрь блока извне;

не входить внутрь условного оператора, т.е. не передавать управление операторам, размещённым после служебных слов if или else;

не входить извне внутрь переключателя (switch);

не передавать управление внутрь цикла.

Следование перечисленным рекомендациям позволяет исключить возможные нежелательные последствия бессистемного использования оператора безусловного перехода. Полностью отказываться от оператора goto вряд ли стоит. Есть случаи, когда этот оператор обеспечивает наиболее простые и понятные решения.

Оператор возврата из функции имеет вид

return выражение;

или просто

return;

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

float square(float z){return z*z;}

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

void cube_print(float z){

if(z<0){ cout « "\t cube = " « z * z * z; return;}

else {cout<< z * z ; return;}

}

В данном примере оператор возврата из функции не содержит выражения.

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

Необходимость в использовании оператора break в теле цикла возникает, когда условия продолжения итераций нужно проверять не в начале итерации (циклы for, while), не в конце итерации (цикл do), а в середине тела цикла. В этом случае тело цикла может иметь такую структуру:

{

операторы