Все операторы, за исключением оговоренных случаев, выполняются один за другим.
оператор: оператор-выражение составной-оператор выбирающий-оператор оператор-цикла оператор-перехода оператор-описания
Оператор-выражение
Чаще всего операторами бывают выражения; в этом случае оператор имеет такой вид:
оператор-выражение: выражение opt ;
Обычно операторы-выражения являются присваиваниями или вызовами функций. Все побочные эффекты выполнения оператора-выражения происходят до выполнения следующего оператора. Оператор-выражение с отсутствующим выражением называется пустым оператором. Он может пригодиться, например, для задания пустого тела оператора цикла.
Составной оператор или блок
Для тех случаев, когда вместо одного оператора нужно использовать несколько, предусмотрен составной оператор (иногда его называют «блок»).
составной-оператор: { список-операторов opt } список-операторов: оператор список-операторов оператор
Отметим, что описание считается оператором.
Выбирающий оператор
Выбирающие операторы выбирают одну из нескольких структур управления.
выбирающий-оператор: if ( выражение ) оператор if ( выражение ) оператор else оператор switch ( выражение ) оператор
Оператор в выбирающем-операторе не может быть описанием.
Оператор if
Выражение должно быть арифметического типа.
Вычисляется выражение, и если оно имеет отличный от нуля результат, выполняется первый вложенный оператор. Если использована конструкция else и выражение дает результат 0, выполняется второй вложенный оператор. Неоднозначность в случае нескольких конструкциями else разрешается путем отнесения else к последнему встретившемуся if, для которого не было else.
Оператор switch
Оператор switch вызывает передачу управления на один из нескольких операторов в зависимости от значения выражения.
Любой из операторов switch можно пометить одним или несколькими префиксами, имеющими вид:
case выражение-метка :
Здесь выражение-метка приводится к преобразованному типу выражения switch.
В переключателе может быть только один префикс вида
default :
Операторы switch могут быть вложенными, тогда метки из case или default относятся к самому первому переключателю, объемлющему их.
При выполнении оператора switch вычисляется выражение, и его значение сравнивается с каждым из выражений-меток (case). Если одно из них равно значению выражения, то управление передается оператору, идущему за этой меткой. Если ни одно из выражений-меток не совпало со значением выражения, но есть префикс default, то управление передается оператору с этим префиксом. Если префикса default нет, и совпадения не было, то не выполняется ни один из операторов переключателя.
Если операторы, выполняемые в результате выбора, не приводят к каким-либо передачам управления, то программа продолжает выполняться «по меткам case и default» беспрепятственно. Выход из switch возможен с помощью оператора break.
Обычно оператор, с которым имеет дело switch, бывает составным.
Операторы цикла
Эти операторы задают виды цикла.
оператор-цикла: while ( выражение ) оператор do оператор while (выражение) ; for ( оператор-иниц выражение-1 opt ; выражение-2 opt ) оператор оператор-иниц: оператор-выражение оператор-описание
Обратите внимание, что конструкция оператор-иниц кончается точкой с запятой.
Оператор в операторе-цикла не должен быть описанием.
Оператор while
В операторе while вложенный оператор выполняется до тех пор, пока значение выражения не станет равным нулю. Проверка происходит перед каждым выполнением оператора.
Выражение должно быть арифметического типа.
Оператор do
В операторе do вложенный оператор выполняется до тех пор, пока значение выражения не станет равным нулю. Проверка происходит после каждого выполнения оператора.
Выражение должно быть арифметического типа.
Оператор for
Оператор for
for (оператор-иниц выражение-1 opt ; выражение-2 opt ) оператор
эквивалентен конструкции
{ оператор-иниц while ( выражение-1 ) { оператор выражение-2 ; } }
за исключением того факта, что оператор continue в операторе for вызовет выполнение выражение-2 перед тем как начать повторное вычисление выражения-1. Таким образом, первый оператор задает инициализацию для цикла, первое выражение производит проверку, выполняемую перед каждым шагом цикла, так что цикл завершается, когда выражение становится нулем, а второе выражение обычно задает приращение, и оно добавляется после каждого шага цикла. Первое выражение должно иметь арифметический тип.
Могут быть опущены одно или оба выражения. Если отсутствует выражение-1, то эквивалентный цикл с while имеет условие while (1).
Если оператор-иниц является описанием, область видимости имен, описанных в нем, простирается до конца оператора for.
Операторы перехода
Операторы перехода делают безусловную передачу управления.
оператор-перехода: break ; continue ; return выражение opt ;
Оператор break
Оператор break может встретиться только в операторе цикла или переключателе, он приводит к окончанию ближайшего из объемлющих его операторов цикла или переключателей. Управление передается на оператор, следующий непосредственно за заканчиваемым, если такой есть.
Оператор continue
Оператор continue может встретиться только в операторе цикла и приводит к передаче управления в заголовок ближайшего из объемлющих операторов цикла, т. е. в конец цикла.
Оператор return
Возврат из функции в обратившуюся к ней функцию происходит с помощью оператора return.
Оператор return без выражения означает отсутствие у функции возвращаемого значения (возвращается значение типа void). Оператор return с выражением используется для возврата значения из функции. Значение выражения передается в ту функцию, которая вызвала данную функцию. Выход из функции по концу эквивалентен возврату без выдаваемого значения.
Оператор описания
Оператор описания заводит в блоке новый идентификатор и имеет вид:
оператор-описания: описание
Если идентификатор, введенный с помощью описания, уже был ранее описан во внешнем блоке, внешнее описание становится скрытым до конца блока, после чего оно опять вступает в силу.
Все инициализации локальных переменных производятся каждый раз, когда выполняется оператор-описание. Уничтожение локальных переменных, описанных в блоке, происходит при выходе из блока. Уничтожение локальных переменных, определенных в цикле, происходит на каждом шаге цикла. Например, переменная j создается и уничтожается каждый раз в течение цикла по i:
for (int i = 0; i<100; i++) for (int j = 0; j<100; j++) { // ... }