Читать «Справочное руководство по C++» онлайн - страница 31

Бьярн Страустрап

    contin: ;          contin: ;       contin: ;

    }                  } while (foo);  }

оператор continue, не относящийся ко внешним операторам цикла, эквивалентен оператору goto contin.

R.6.6.3 Оператор return

Возврат из функции в обратившуюся к ней функцию происходит с помощью оператора return.

Оператор return без выражения можно использовать только в функциях, которые не возвращают значение, т.е. в функциях, возвращающих значение типа void, или в конструкторах (§R.12.1) и деструкторах (§R.12.4). Оператор return с выражением можно использовать только в функциях, которые возвращают значение. Значение выражения передается в ту функцию,которая вызвала данную функцию. Если нужно, значение преобразуется к типу функции, в которой выполняется return, по тем же правилам как при инициализации. Это может привести к вызову конструктора или копированию временных объектов (§R.12.2). Выход из функции по концу эквивалентен возврату без выдаваемого значения, что является незаконным для функции, возвращающей значение.

R.6.6.4 Оператор goto

Оператор goto безусловно передает управление на оператор, помеченный идентификатором. Идентификатор должен быть меткой (§R.6.1), находящейся в текущей функции.

R.6.7 Оператор описания

Оператор описания заводит в блоке новый идентификатор и имеет вид:

оператор-описания:

 описание

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

Все инициализации автоматических (auto) и регистровых (register) переменных производятся каждый раз, когда выполняется оператор-описание. Уничтожение локальных переменных, описанных в блоке, происходит при выходе из блока (§R.6.6). Уничтожение автоматических переменных, определенных в цикле, происходит на каждом шаге цикла. Например, переменная Index j создается и уничтожается каждый раз в течение цикла по i:

for (int i = 0; i‹100; i++)

 for (Index j = 0; j‹100; j++) {

  //…

 }

Выход из цикла или из блока или переход, минуя инициализацию автоматических переменных, приводит к уничтожению автоматических переменных, описанных в точке, откуда происходит переход, но не в точке, куда происходит переход.

Переход в блок возможен при условии, что он не приводит к пропуску инициализации. Считается незаконным переход, обходящий описание с явной или неявной инициализацией, кроме случаев, когда оно находится во внутреннем блоке, который пропускается (т.е. в него никогда не попадает управление) или переход происходит из той точки, где уже была инициализация переменной. Например,

void f()

{

 //…

 goto lx; // ошибка: переход, минуя инициализацию

 //…

 ly:

 X a = 1;

 //…

 lx:

 goto ly; // нормально, за переходом будет вызов

 // деструктора для `a'

}