Сделай Сам Свою Работу на 5

R.6.3 Составной оператор или блок





 

Для тех случаев, когда вместо одного оператора нужно использовать несколько, предусмотрен составной оператор (иногда его называют "блок").

составной-оператор:

{ список-операторов opt }

список-операторов:

оператор

список-операторов оператор

Отметим, что описание считается оператором (§R.6.7).

 

R.6.4 Выбирающий оператор

 

Выбирающие операторы выбирают одну из нескольких структур управления.

выбирающий-оператор:

if ( выражение ) оператор

if ( выражение ) оператор else оператор

switch ( выражение ) оператор

Оператор в выбирающем-операторе не может быть описанием.

 

R.6.4.1 Оператор if

 

Выражение должно быть арифметического типа, или типа указателя, или типа класс, для которого существует однозначное преобразование в арифметический тип или тип указателя (§R.12.3).

Вычисляется выражение, и если оно имеет отличный от нуля результат, выполняется первый вложенный оператор. Если использована конструкция else и выражение дает результат 0, выполняется второй вложенный оператор. Неоднозначность в случае нескольких конструкциями else разрешается путем отнесения else к последнему встретившемуся if, для которого не было else.



 

R.6.4.2 Оператор переключателя

 

Оператор переключателя вызывает передачу управления на один из нескольких операторов в зависимости от значения выражения.

Выражение должно быть целочисленного типа или типа класса, для которого существует однозначное преобразование к целочисленному типу (§R.12.3). Выполняются стандартные целочисленные преобразования. Любой из операторов переключателя можно пометить одним или несколькими префиксами, имеющими вид:

case выражение-константа:

Здесь выражение-константа (§R.5.19) приводится к преобразованному типу выражения переключателя. Никакие две константы из case одного переключателя не должны иметь одинаковое значение.

В переключателе может быть только один префикс вида

default:

Операторы переключателя могут быть вложенными, тогда метки из case или default относятся к самому первому переключателю, объемлющему их.

При выполнении оператора переключателя вычисляется выражение, и его значение сравнивается с каждой из констант вариантов (case). Если одна из этих констант равна значению выражения, то управление передается в оператор, идущий за этой константой. Если ни одна из констант не совпала со значением выражения, но есть префикс default, то управление передается на оператор с этим префиксом. Если префикса default нет, и совпадения не было, то не выполняется ни один из операторов переключателя.



Если операторы, выполняемые в результате выбора, не приводят к каким-либо передачам управления, то программа продолжает выполняться "по меткам case и default" беспрепятственно. Выход из переключателя возможен с помощью оператора break (см. §R.6.6.1).

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

 

 

R.6.5 Операторы цикла

 

Эти операторы задают виды цикла.

оператор-цикла:

while ( выражение ) оператор

do оператор while ( выражение )

for ( оператор-иниц выражение opt ; выражение opt ) оператор

оператор-иниц:

оператор-выражение

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

Обратите внимание, что конструкция оператор-иниц кончается точкой с запятой.

Оператор в операторе-цикла не должен быть описанием.

 

R.6.5.1 Оператор while

 

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



Выражение должно быть арифметического типа, или типа указателя, или типа класс, для которого существует однозначное преобразование в арифметический тип или тип указателя (§R.12.3).

 

R.6.5.2 Оператор do

 

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

Выражение должно быть арифметического типа, или типа указателя, или типа класс, для которого существует однозначное преобразование в арифметический тип или тип указателя (§R.12.3).

 

R.6.5.3 Оператор for

 

Оператор for

for ( оператор-иниц выражение-1 opt ; выражение-2 opt ) оператор

эквивалентен конструкции

оператор-иниц

while ( выражение-1 ) {

оператор

выражение-2 ;

}

за исключением того факта, что оператор continue в операторе for вызовет выполнение выражение-2 перед тем, как начать повторное вычисление выражения-1. Таким образом, первый оператор задает инициализацию для цикла, первое выражение производит проверку, выполняемую перед каждым шагом цикла, так что цикл завершается, когда выражение становится нулем, а второе выражение обычно задает приращение, и оно добавляется после каждого шага цикла. Первое выражение должно иметь арифметический тип, или тип указателя, или тип класса, для которого существует однозначное преобразование к арифметическому типу или типу указателя (§R.12.3).

Могут быть опущены одно или оба выражения. Если отсутствует выражение-1, то эквивалентный цикл с while имеет условие while(1).

Если оператор-иниц является описанием, область видимости имен, описанных в нем, простирается до конца блока, закрывающего оператор for.

 

 

R.6.6 Операторы перехода

 

Операторы перехода делают безусловную передачу управления.

оператор-перехода:

break ;

continue ;

return выражение opt ;

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

По выходе из области видимости (каким бы образом это не произошло) вызываются деструкторы (§R.12.4) для всех объектов классов, построенных в этой области, которые еще не были уничтожены. Это относится как к явно описанным объектам, так и ко временным объектам (§R.12.2).

 

R.6.6.1 Оператор break

 

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

 

R.6.6.2 Оператор continue

 

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

while (foo) { do { for (;;) {

// ... // ... // ...

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'

}

Автоматическая переменная, которая была создана при некотором условии, уничтожается при выполнении этого условия, и не может быть доступна вне проверки этого условия. Например,

if (i)

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

//…

}

if (j !=100) // ошибка: обращение вне условия

//…

;

Инициализация локального объекта с классом памяти static (§R.7.1.1) производится прежде, чем управление пройдет через область его описания. Если статическая переменная инициализируется выражением, которое не является выражением-константой, то перед первым входом в блок происходит стандартная инициализация нулем, приведенным к нужному типу (§R.8.4).

Деструктор для локального статического объекта будет вызываться в том и только в том случае, если переменная была создана с помощью конструктора. Деструктор должен вызываться сразу перед вызовом или как составная часть вызова функций, заданных в atexit() (§R.3.4).

 

 








Не нашли, что искали? Воспользуйтесь поиском по сайту:



©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.