netlib.narod.ru< Назад | Оглавление | Далее >

A9. Инструкции

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

  инструкция:
      помеченная–инструкция
      инструкция–выражение
      составная-инструкция
      инструкция-выбора
      циклическая-инструкция
      инструкция-перехода

A9.1. Помеченные инструкции

Инструкции может предшествовать метка.

  помеченная-инструкция:
      идентификатор : инструкция
      case константное-выражение : инструкция
      default : инструкция

Метка, состоящая из идентификатора, одновременно служит и объявлением этого идентификатора. Единственное назначение идентификатора-метки — указать место перехода для goto. Областью видимости идентификатора-метки является текущая функция. Так как метки имеют свое собственное пространство имен, они не конфликтуют с другими идентификаторами и не могут быть перекрыты (см. A11.1.).

Метки case и default используются в инструкции switch (A9.4). Константное выражение в case должно быть целочисленным.

Сами по себе метки не изменяют порядка вычислений.

A9.2. Инструкция-выражение

Наиболее употребительный вид инструкции — это инструкция-выражение.

  инструкция-выражение:
      выражениенеоб ;

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

A9.3. Составная инструкция

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

  составная-инструкция:
      { список-объявлений список-инструкцийнеоб }

  список-объявлений:
      объявление
      список-объявлений объявление

  список-инструкций:
      инструкция
      список-инструкций инструкция

Если идентификатор из списка объявлений находился в области видимости объемлющего блока, то действие внешнего объявления при входе внутрь данного блока приостанавливается (A11.1), а после выхода из него возобновляется. Внутри блока идентификатор может быть объявлен только один раз. Для каждого отдельного пространства имен эти правила действуют независимо (A11); идентификаторы из разных пространств имен всегда различны.

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

A9.4. Инструкции выбора

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

  инструкция-выбора:
      if ( выражение ) инструкция
      if ( выражение ) инструкция else инструкция
      switch ( выражение ) инструкция

Оба вида инструкций if содержат выражение, которое должно иметь арифметический тип или тип указателя. Сначала вычисляется выражение со всеми его побочными эффектами, результат сравнивается с 0. В случае несовпадения с 0 выполняется первая подинструкция. В случае совпадения с 0 для второго типа if выполняется вторая подинструкция. Связанная со словом else неоднозначность разрешается тем, что слово else соотносят с последней еще не имеющей else инструкцией if, расположенной в одном с этим else блоке и на одном уровне вложенности блоков.

Инструкция switch вызывает передачу управления на одну из нескольких инструкций в зависимости от значения выражения, которое должно иметь целочисленный тип.

Управляемая с помощью switch подинструкция обычно составная. Любая инструкция внутри этой подинструкции может быть помечена одной или несколькими метками case (A9.1). Управляющее выражение подвергается целочисленному повышению (A6.1), а константы в case приводятся к повышенному типу. После такого преобразования никакие две константы в ветвях case одной инструкции switch не должны иметь одинаковых значений. C инструкцией switch может быть связано не более одной метки default. Конструкции switch допускается вкладывать друг в друга; метки case и default относятся к самой внутренней инструкции switch из тех, которые их содержат.

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

В первой версии языка требовалось, чтобы выражение и константы в ветвях case инструкции switch были типа int.

A9.5. Циклические инструкции

Циклические инструкции специфицируют циклы.

  циклическая-инструкция:
      while (выражение) инструкция
      do инструкция while (выражение)
      for (выражениенеоб ; выражениенеоб ; выражениенеоб ) инструкция

В инструкциях while и do выполнение подинструкций повторяется до тех пор, пока значение выражения не станет нулем. Выражение должно иметь арифметический тип или тип указателя. В while вычисление выражения со всеми побочными эффектами и проверка осуществляются перед каждым выполнением инструкции, a в do — после.

В инструкции for первое выражение вычисляется один раз, тем самым осуществляется инициализация цикла. На тип этого выражения никакие ограничения не накладываются. Второе выражение должно иметь арифметический тип или тип указателя; оно вычисляется перед каждой итерацией. Как только его значение становится равным 0, for прекращает свою работу. Третье выражение вычисляется после каждой итерации и, следовательно, выполняет повторную инициализацию цикла. Никаких ограничений на его тип нет. Побочные эффекты всех трех выражений заканчиваются по завершении их вычислений. Если подинструкция не содержит в себе continue) то

  for (выражение1 ; выражение2 ; выражениеЗ) инструкция

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

  выражение1;
  while (выражение2) {
      инструкция
      выражениеЗ;
  }

Любое из трех выражений цикла может быть опущено. Считается, что отсутствие второго выражения равносильно сравнению с нулем ненулевой константы.

A9.6. Инструкции перехода

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

  инструкция-перехода:
      goto идентификатор;
      continue;
      break;
      return выражениенеоб;

В инструкции goto идентификатор должен быть меткой (A9.1), расположенной в текущей функции. Управление передается на помеченную инструкцию.

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

  while (...){
      ...
  contin: ;
  }

  do {
      ...
  contin: ;
  } while (...);

  for (...){
      ...
  contin: ;
  }

инструкция continue, если она не помещена в еще более внутренний цикл, делает то же самое, что и goto contin.

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

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

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


netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz