Kernighan, B. W. and Ritchie, D. M. "The 'C' Programming Language"; Chapter 18

18. Операторы.

За исключением особо оговариваемых случаев, операторы выполняютсяпоследовательно.

Содержание

18.1. Операторное выражение.
18.2. Составной оператор (или блок).
18.3. Условные операторы.
18.4. Оператор while.
18.5. Оператор do.
18.6. Оператор for.
18.7. Оператор switch.
18.8. Оператор break.
18.9. Оператор continue.
18.10. Оператор возврата.
18.11. Оператор goto.
18.12. Помеченный оператор.
18.13. Пустой оператор.


18.1. Операторное выражение.

Большинство операторов являются операторными выражениями, которыеимеют форму

 выражение;
Обычно операторные выражения являются присваиваниями или обращениямик функциям.


18.2. Составной оператор (или блок).

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

Составной оператор:
{список-описанийнеоб список-операторовнеоб}

Список-описаний:
описание
описание список-описаний

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

Если какой-либо идентификатор из списка-описаний был описан ранее,то во время выполнения блока внешнее описание подавляется и сновавступает в силу после выхода из блока.

Любая инициализация автоматических и регистровых переменныхпроводится при каждом входе в блок через его начало. В настоящее времяразрешается (но это плохая практика) передавать управление внутрьблока; в таком случае эти инициализации не выполняются. Инициализациистатических переменных проводятся только один раз, когда начинаетсявыполнение программы.

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


18.3. Условные операторы.

Имеются две формы условных операторов:

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


18.4. Оператор while.

Оператор while имеет форму

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


18.5. Оператор do.

Оператор do имеет форму

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


18.6. Оператор for.

Оператор for имеет форму

 for( выражениe-1необ; выражениe-2необ; выражениe-3необ) оператор
Оператор for эквивалентен следующему
  выражениe-1;  while( выражениe-2 )   {    оператор    выражение-3  }
Таким образом, первое выражение определяет инициализацию цикла; второеспецифиуирует проверку, выполняемую перед каждой итерацией, так чтовыход из цикла происходит тогда, когда значение выражения становитсянулем; третье выражение часто задает приращение параметра, котороепроводится после каждой итерации.

Любое выражение или даже все они могут быть опущены. Если отсутствуетвторое выражение, то предложение с while считается эквивалентнымwhile(1); другие отсутствующие выражения просто опускаются изприведенного выше расширения.


18.7. Оператор switch.

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

 switch (выражение) оператор
В выражении проводятся обычные арифметические преобразования, норезультат должен иметь тип int. Оператор обычно является составным.Любой оператор внутри этого оператора может быть помечен одним или болеевариантным префиксом case, имеющим форму:
 case константное выражение:
где константное выражение должно иметь тип int. Никакие две вариантныеконстанты в одном и том же переключателе не могут иметь одинаковоезначение. Точное определение константного выражения приводится в п. 24.

Кроме того, может присутствовать самое большее один операторный префиксвида

 default:

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

Сами по себе префиксы case и default не изменяют поток управления,которое беспрепятсвенно проходит через такие префиксы. Для выхода изпереключателя смотрите оператор break, п. 18.8.

Обычно оператор, который входит в переключатель, является составным.Описания могут появляться в начале этого оператора, но инициализацииавтоматических и регистровых переменных будут неэффективными.


18.8. Оператор break.

Оператор

 break;
вызывает завершение выполнения наименьшего охватывающего этот оператороператора while, do, for или switch; управление передается оператору,следующему за завершенным оператором.


`8.9. Оператор continue.

Оператор

 continue;
приводит к передаче управления на продолжающую цикл часть наименьшегоохватывающего этот оператор оператора while, do или for; то есть наконец цикла. Более точно, в каждом из операторов
  while(...) {       do {               for(...) {  ...                ...                ...  contin: ;          contin: ;          contin: ;  }                  }while(...);       }
оператор continue эквивалентен оператору goto contin. (за contin:следует пустой оператор; см. п. 18.13.).


18.10. Оператор возврата.

Возвращение из функции в вызывающую программу осуществляется спомощью оператора return, который имеет одну из следующих форм

  return;  return выражение;
В первом случае возвращаемое значение неопределено. Во втором случаев вызывающую функцию возвращается значение выражения. Если требуется,выражение преобразуется к типу функции, в которой оно появляется, какв случае присваивания. Попадание на конец функции эквивалентно возвратубез возвращаемого значения.


18.11. Оператор goto.

Управление можно передавать безусловно с помощью оператора

  goto идентификатор1
Идентификатор должен быть меткой (п. 18.12), локализованной в данной функции.


18.12. Помеченный оператор.

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

  идентификатор:
который служит для описания идентификатора в качестве метки. Меткииспользуются только для указания места, куда передается управлениеоператором goto. Областью действия метки является данная функция,за исключением любых подблоков, в которых тот же идентификаторописан снова. Смотри п. 20.


18.13. Пустой оператор.

Пустой оператор имеет форму:

 ;
Пустой оператор оказывается полезным, так как он позволяет поставитьметку перед закрывающей скобкой } составного оператора или указатьпустое тело в операторах цикла, таких как while.