Nickolay.info. Обучение. Лекции по Си. Глава 4

4. Операторы

 

Операторы управляют процессом выполнения программы. Набор операторов Си содержит все типовые управляющие конструкции структурного программирования.

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

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

Составной оператор ограничивается фигурными скобками { }. Все другие операторы заканчиваются точкой с запятой (;). Точка с запятой в языке Си является признаком конца оператора, а не разделителем операторов, как в ряде других языков.

Перед любым оператором может быть записана метка, состоящая из имени и двоеточия. Метки распознаются только оператором goto.

Далее приведен полный список операторов Си.

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

Составной оператор или блок { }. Действие составного оператора заключается в последовательном выполнении содержащихся в нем операторов, за исключением тех случаев, когда какой‑либо оператор явно передает управление в другое место программы. Типичное применение блока подобно другим языкам - ограничение тела функции, тела цикла, описания структурного типа данных или ветви условного оператора.

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

Оператор‑выражение строится по правилам, описанным в п. 3.

Условный оператор if записывается в общем виде следующим образом:

     if (УсловноеВыражение1) оператор1;

   else if (УсловноеВыражение2) оператор2;

   :

   else if (УсловноеВыражениеN) операторN;

   else оператор0;

Как и в других языках, выполняется только один из операторов 1,2,:,N, в зависимости от того, какое из соответствующих условных выражений первым оценено как истинное. Если все условия ложны, выполняется оператор0. Любая из ветвей, кроме первой, необязательна. Круглые скобки и точки с запятой обязательны везде, где указаны. Еще раз акцентируем внимание на том, что в Си отсутствуют булевские выражения и в качестве условий применяются обычные выражения языка Си. Значение выражения считается истинным, если оно не равно нулю, и ложным, если равно нулю. Из этого следует, что условные выражения не обязательно должны содержать операции отношения. Условия могут быть записаны в обычном виде

if (а < 0) :

а могут выглядеть, например, так:

if (а) : или if (а + b) : .

Условия могут включать логические функции:

if (x>0 && y>0) ch=1;

Оператор пошагового цикла for имеет следующий общий вид:

for (НВ; УВ; ВП) Оператор;

Здесь НВ - начальное выражение, служащее для инициализации параметров цикла, УВ - условное выражение, прямо или косвенно определяющее число повторений цикла (цикл выполняется, пока УВ не станет ложным), ВП - выражение приращения, используемое для модификации параметра или параметров цикла. Любое из трех выражений может быть опущено, а также любые 2 выражения или все сразу.

Цикл работает следующим образом: сначала вычисляется НВ, если оно имеется. Затем вычисляется УВ и производится его оценка следующим образом:

·       если УВ истинно (не равно нулю), то выполняется тело оператора. Затем вычисляется ВП, если оно есть, и процесс повторяется;

·       если УВ опущено, то его значение принимается за истину и процесс выполнения продолжается, как описано выше. В этом случае цикл for бесконечен и может завершиться только при выполнении в его теле операторов break, goto, return;

·       если УВ ложно, то выполнение цикла заканчивается и управление передается следующему за ним оператору программы. Цикл for может завершиться также при выполнении операторов break, goto, return в его теле.

Пример: показанный ниже цикл выполняется 10 раз.

for (x=1; x<11; x++) printf ("*");

Оператор цикла с предусловием while:

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

Тело цикла while выполняется до тех пор, пока значение выражения не станет ложным (равным нулю). Сначала вычисляется выражение, если оно изначально ложно, то тело цикла не выполняется и управление передается на следующий за ним оператор программы. Если выражение истинно, то выполняется тело цикла. Перед каждым следующим выполнением цикла выражение вычисляется заново. Процесс повторяется до тех пор, пока выражение не станет ложным. Оператор while может завершиться досрочно при выполнении break, goto или return внутри своего тела.

Приведенный далее цикл while аналогичен показанному выше for:

x=1;

while (x<11) {

printf ("*");

 x++;

}

Оператор цикла с постусловием do записывается в виде

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

Тело цикла do выполняется один или несколько раз до тех пор, пока значение выражения не станет ложным (равным нулю). Сначала выполняется тело цикла - оператор, затем вычисляется условие - выражение. Если выражение ложно, цикл завершается и управление передается следующему за телом цикла оператору программы. Если выражение истинно (не равно нулю), то тело цикла выполняется вновь, и выражение вычисляется повторно. Выполнение цикла повторяется до тех пор, пока выражение не станет ложным. Цикл do может завершиться досрочно при выполнении в своем теле операторов break, goto, return. Показанный далее цикл по действию совпадает с примерами на for и while:

x=1;

do {

 printf ("*"); x++;

} while (x<11);

Операторпереключатель switch записывается в виде

switch (выражение) {

 объявление

 case КВ1: оператор1;

 :

 case КВN: операторN;

 default: оператор0;

}

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

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

Все КВ должны иметь порядковый тип. В ряде компиляторов КВ принудительно преобразуются к типу int. Тип каждой КВ также приводится к типу выражения переключения.

После вычисления выражения переключателя управление передается тому из операторов 1,:,N тела переключателя, значение константы варианта которого совпадает со значением выражения переключения.

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

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

Синтаксически конструкции case и default являются метками, однако, на них нельзя передать управление по оператору goto. Метки case и default существенны только при начальной проверке, когда выбирается оператор для выполнения в теле переключателя. Все операторы тела переключателя, следующие за выбранным, выполняются последовательно, "не замечая" меток case и default, если только какой‑либо оператор не передаст управление за пределы тела переключателя. Для выхода из тела переключателя после выполнения одной из ветвей, как правило, используется оператор разрыва break.

В заголовок составного оператора, формирующего тело switch, можно помещать объявления (см. п. 5), но инициализаторы, включенные в объявления, не будут выполнены. Приведенный ниже оператор‑переключатель отслеживает коды нажатия некоторых клавиш:

char c=getch();

switch (c) {

case ' ': printf ("\nПробел"); break;

case 72: case 80:

  printf ("\nСтрелка вверх или вниз");

break;

default: printf ("\nДругая клавиша");

}

Оператор продолжения continue передает управление на следующую итерацию в циклах do, for, while. Он может появиться только в теле этих операторов. Остающиеся в теле цикла операторы при этом не выполняются. В циклах do и while следующая итерация начинается с вычисления условного выражения. В цикле for следующая итерация начинается с вычисления выражения приращения, а затем происходит вычисление условного выражения.

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

Оператор перехода goto имеет вид

goto метка;

и передает управление непосредственно на оператор, помеченный меткой:

метка: оператор;

Метка представляет собой обычный идентификатор. Область действия метки ограничивается функцией, в которой она определена. Каждая метка должна быть уникальна в пределах функции, где она указана. Нельзя передать управление по оператору goto в другую функцию. Метка оператора имеет смысл только для goto. Можно войти в блок, тело цикла, условный оператор, оператор‑переключатель по метке. Нельзя с помощью goto передать управление на конструкции case и default в теле переключателя.

Оператор возврата return выражение; заканчивает выполнение функции, в которой он содержится, и возвращает управление в вызывающую функцию.

Управление передается в точку вызывающей функции, непосредственно следующую за оператором вызова функции. Значение выражения, если оно задано, вычисляется, приводится к типу, объявленному для функции, содержащей оператор, и возвращается в вызывающую функцию. Если выражение опущено, то возвращаемое функцией значение не определено (является пустым).

 

Рейтинг@Mail.ru
вверх гостевая; E-mail