240 Часть II. Программирование на C++

goto

Оператор перехода goto переводит управление программой на заданный оператор-метку. Целевая метка должна находиться внутри той же самой функции, что и оператор goto. Оператор перехода, так же как и оператор switch, не может быть выполнен в обход инициализации переменной в той же или вышестоящей области видимости. Как и в случае оператора switch, решение в том, чтобы заключить инициализацию локальной переменной в скобки, чтобы при переходе полностью пропускался блок, сожержащий инициализацию.

Операторы goto обычно являются результатом неряшливого программирования. За логикой программы, в которой содержатся операторы goto, может быть чрезвычайно трудно уследить. Только в очень редких случаях использование оператора goto уместно и прибавляет программе ясности.

Листинг 10.10 демонстрирует пример неоправданного использования оператора goto: он использован дяя выхода из циклов for и while,вместо двух операторов break.

h02401.jpg

ftinclude <iostream.h>

void main() {

const unsigned MAX_STR_LEN =100;

const char с = '$' ;

char s[MAX_STR_LEN] ;

cout « "\пВведите строку с секретным символом (Выход по <Ctrl+C>).\n" while (cin.getlinefs, MAX_STR_LEN-1)) {

// Считаем общее число символов в s, исключая завершающий нуль. char *sp = s;

int len = 0;

while (*sp++) ++len;

for (int i = 0; i < len; i++) if (s[i] == c) goto YOU_WIN;

cout « "\пИзвините. Попробуйте еще раз.\п";

}

cout « "\пВ следующий раз вам повезет больше.\п"; ' goto EMD; // Никаких поздравлений. YOU_WIN:

cout « "\пПоздравляю. Вы очень догадливы!\п";

END:; // Закрывающая скобка не может идти за меткой. }