Операторы выполняются последовательно во всех случаях кроме особо оговоренных.
Большинство операторов является операторами выражение, которые имеют вид
выражение ;
Обычно операторы выражение являются присваиваниями и вызовами функций.
Составной оператор (называемый также "блок", что эквивалентно) дает возможность использовать несколько операторов в том месте, где предполагается использование одного:
составной_оператор: { список_описаний opt список_операторов opt } список_описаний: описание описание список_описаний список_операторов: оператор оператор список_операторов
Если какой-либо из идентификаторов в списке_описаний был ранее описан, то внешнее описание выталкивается на время выполнения блока, и снова входит в силу по его окончании.
Каждая инициализация auto или register переменных производится всякий раз при входе в голову блока. В блок делать передачу; в этом случае инициализации не выполняются. Инициализации переменных, имеющих класс памяти static (#4.2) осуществляются только один раз в начале выполнения программы.
Есть два вида условных операторов
if ( выражение ) оператор if ( выражение ) оператор else оператор
В обоих случаях вычисляется выражение, и если оно не ноль, то выполняется первый подоператор. Во втором случае второй подоператор выполняется, если выражение есть 0. Как обычно, неоднозначность "else" разрешается посредством того, что else связывается с последним встреченным if, не имеющим else.
Оператор while имеет вид
while ( выражение ) оператор
Выполнение подоператора повторяется, пока значение выражения остается ненулевым. Проверка выполняется перед каждым выполнением оператора.
Оператор do имеет вид
do оператор while (выражение);
Выполнение подоператора повторяется до тех пор, пока значение выражения не станет нулем. Проверка выполняется после каждого выполнения оператора.
Оператор for имеет вид
for ( выражение_1 opt ; выражение_2 opt ; выражение_3 opt ) операторЭтот оператор эквивалентен следующему:
выражение_1; while (выражение_2) { оператор выражение_3; }
Первое выражение задает инициализацию цикла; второе выражение задает осуществляемую перед каждой итерацией проверку, по которой производится выход из цикла, если выражение становится нулем; третье выражение часто задает приращение, выполняемое после каждой итерации.
Каждое или все выражения могут быть опущены. Отсутствие выражения_2 делает подразумеваемое while-предложение эквивалентным while(1); остальные опущенные выражения просто пропускаются в описанном выше расширении.
Оператор switch вызывает передачу управления на один из нескольких операторов в зависимости от значения выражения. Он имеет вид
switch ( выражение ) оператор
Выражение должно быть целого типа или типа указателя. Любой оператор внутри оператора может быть помечен одним или более префиксом case следующим образом:
case константное_выражение :где константное выражение должно иметь тот же тип что и выражение- переключатель; производятся обычные арифметические преобразования. В одном операторе switch никакие две константы, помеченные case, не могут иметь одинаковое значение. Константные выражения точно определяются в #15.
Может также быть не более чем один префикс оператора вида
default :
Когда выполнен оператор switch, проведено вычисление его выражения и сравнение его с каждой case константой. Если одна из констант равна значению выражения, то управление передается на выражение, следующее за подошедшим префиксом case. Если никакая case константа не соответствует выражению, и есть префикс default, то управление передается на выражение, которому он предшествует. Если нет соответствующих вариантов case и default отсутствует, то никакой из операторов в операторе switch не выполняется.
Префиксы case и default сами по себе не изменяют поток управления, который после задержки идет дальше, перескакивая через эти префиксы. Для выхода из switch см. break, #9.8.
Обычно зависящий от switch оператор является составным. В голове этого оператора могут стоять описания, но инициализации автоматических и регистровых переменных являются безрезультатными.
Оператор
break ;прекращает выполнение ближайшего охватывающего while, do, for или switch оператора; управление передается на оператор, следующий за законченным.
Оператор
continue ;вызывает передачу управления на управляющую продолжением цикла часть наименьшего охватывающего оператора while, do или for; то есть на конец петли цикла. Точнее, в каждом из операторов
while (...) do for (...) { { { ... ... ... contin:; contin:; contin:; } } } while (...);continue эквивалентно goto contin. (За contin: следует пустой оператор, #9.13.)
Возврат из функции в вызывающую программу осуществляется с помощью оператора return, имеющего один из двух видов:
return ; return выражение ;
Первый может использоваться только в функциях, не возвращающих значения, т.е. в функциях с типом возвращаемого значения void. Вторая форма может использоваться только в функциях, не возвращающих значение; вызывающей функцию программе возвращается значение выражения. Если необходимо, то выражение преобразуется, как это делается при присваивании, к типу функции, в которой оно возникло. Обход конца функции эквивалентен возврату return без возвращаемого значения.
Можно осуществлять безусловную передачу управления с помощью оператора
goto идентификатор ;
Идентификатор должен быть меткой (#9.12), расположенной в текущей функции.
Перед любым оператором может стоять префикс метка, имеющий вид
идентификатор :который служит для описания идентификатора как метки. Метка используется только как объект для goto. Областью видимости метки является текущая функция, исключая любой подблок, в котором был переописан такой же идентификатор. См. #4.1.
Пустой оператор имеет вид
;
Пустой оператор используется для помещения метки непосредственно перед } составного оператора или того, чтобы снабдить такие операторы, как while, пустым телом.
Оператор delete имеет вид
delete выражение ;
Результатом выражения должен быть указатель. Объект, на который он указывает, уничтожается. Это значит, что после оператора уничтожения delete нельзя гарантировать, что объект имеет определенное значение; см. #17. Эффект от применения delete к указателю, не полученному из операции new (#7.1), не определен. Однако, уничтожение указателя с нулевым значением безопасно.
Оператор asm имеет вид
asm ( строка) ;
Смысл оператора asm не определен. Обычно он используется для передачи информации через компилятор ассемблеру.
Назад | Содержание | Вперед