C. Бочков - Язык программирования Си для персонального компьютера
пустой оператор
составной оператор или блок
оператор-выражение
условный оператор if
оператор пошагового цикла for
оператор цикла с предусловием while
оператор цикла с постусловием do
оператор продолжения continue
оператор-переключатель switch
оператор разрыва break
оператор перехода goto
оператор возврата return
В составе некоторых операторов используются выражения, выполняющие роль условий. В зависимости от значения такого условного выражения выбирается та или иная последовательность действий. В языке Си отсутствуют булевские выражения как самостоятельный класс выражений; в качестве условных выражений применяются обычные выражения языка Си. Значение выражения считается истинным, если оно не равно нулю, и ложным, если равно нулю. Из этого следует, что условные выражения не обязательно должны содержать операции отношения
if(а < 0) …
а могут выглядеть, например, так:
if(а) … или if(а + b)
В теле некоторых операторов языка Си могут содержаться другие операторы. Оператор, находящийся в теле другого оператора, в свою очередь может содержать операторы.
Составной оператор ограничивается фигурными скобками. Все другие операторы заканчиваются точкой с запятой (;). Точка с запятой в языке Си является признаком конца оператора, а не разделителем операторов, как в ряде других языков программирования.
Перед любым оператором языка Си может быть записана метка, состоящая из имени и двоеточия. Операторные метки распознаются только оператором goto (см. раздел 5.12 "Оператор перехода goto").
Программа на языке Си выполняется последовательно, оператор за оператором, за исключением случаев, когда какой-либо оператор явно передает управление в другую часть программы, например при вызове функции или возврате из функции.
Пустой оператор
Синтаксис:
;
Действие:
Пустой оператор — это оператор, состоящий только из точки с запятой. Он может появиться в любом месте программы, где по правилам синтаксиса требуется оператор. Выполнение пустого оператора не меняет состояния программы.
Пример:
for(i = 0; i < 10; line[i++] = 0);
Для таких операторов, как do, for, if, while, требуется, чтобы в их теле был хотя бы один оператор. Пустой оператор удовлетворяет требованиям синтаксиса в случаях, когда никаких действий не требуется. В приведенном примере третье выражение в заголовке оператора цикла for инициализирует первые 10 элементов массива line нулем. Тело оператора for состоит из пустого оператора, поскольку нет необходимости в других операторах.
Пустой оператор, подобно любому другому оператору языка Си, может быть помечен меткой. Например, чтобы пометить закрывающую фигурную скобку составного оператора, которая не является оператором, нужно вставить перед ней помеченный пустой оператор.
Составной оператор
Синтаксис:
{
[<объявление>]
.
.
.
[<оператор>]
}
Действие:
Действие составного оператора заключается в последовательном выполнении содержащихся в нем операторов, за исключением тех случаев, когда какой-либо оператор явно передает управление в другое место программы.
В начале составного оператора могут содержаться объявления (см. разделы 3.6, 3.6.2). Они служат для определения переменных, локальных для данного блока, либо для распространения на данный блок области действия глобальных объектов.
Пример:
if(i > 0) {
line[i] = х;
х++;
}
Типично использование составного оператора в качестве тела другого оператора, например оператора if. В приведенном примере, если i больше нуля, будут последовательно выполнены операторы, содержащиеся в составном операторе.
Подобно другим операторам языка Си, любой оператор внутри составного оператора может быть помечен. Передача управления по метке внутрь составного оператора возможна, однако если составной оператор содержит объявления переменных с инициализацией, то при входе в блок по метке эта инициализация не будет выполнена и значения переменных будут непредсказуемы.
Можно поставить метку и на сам составной оператор, если только это не оператор, составляющий тело функции.
Оператор-выражение
Синтаксис:
<выражение>;
Действие:
<Выражение> вычисляется в соответствии с правилами, изложенными в разделе 4 "Выражения". Отличие оператора-выражения состоит в том, что значение содержащегося в нем выражения никак не используется. Кроме того, он может быть записан лишь там, где по синтаксису допустим оператор.
Примеры:
х = у+3; /*пример 1*/
х++; /*пример 2*/
f(x); /*пример 3*/
В первом примере х присваивается значение у+3. Во втором примере х инкрементируется.
В третьем примере показано выражение вызова функции. Если функция возвращает значение, то обычно оператор-выражение содержит операцию присваивания, чтобы запомнить значение, возвращаемое вызванной функцией. В данном примере возвращаемое значение не используется.
Условный оператор if
Синтаксис:
if(<выражение>)
<оператор1>
[else
<оператор2>]
Действие:
Тело условного оператора if выполняется в зависимости от значения <выражения>.
Сначала вычисляется <выражение>. Если значение выражения истинно (не равно нулю), то выполняется <оператор1>. Если же значение выражения ложно, то выполняется <оператор2>, непосредственно следующий за ключевым словом else.
Если значение <выражения> ложно, но конструкция else опущена, то управление передается на оператор, следующий в программе за оператором if.
Пример:
if(i > 0)
У = х/i;
else {
х = 1;
у = f(x);
}
В примере, если i больше нуля, выполняется оператор у=x/i;. Если i меньше или равно нулю, то значение i присваивается переменной х, а значение, возвращаемое функцией f(x), присваивается переменной у.
ВложенностьОператор if может быть вложен в <оператор1> или <оператор2> другого оператора if. При вложении операторов if рекомендуется для ясности группирования операторов использовать фигурные скобки, ограничивающие <оператор1> и <оператор2>.
Если же фигурные скобки отсутствуют, то компилятор ассоциирует каждое ключевое слово else с ближайшим оператором if, у которого отсутствует конструкция else.
На ключевое слово if можно поставить метку, а на ключевое слово else — нельзя (однако можно поставить метку на <оператор2>, следующий за else).
Примеры.
/* пример 1 — без скобок */
if(i > 0)
if(j > i)
x = j;
else x = i;
/* пример 2 — со скобками */
if(i > 0) {
if(j > i)
x = j;
}
else
x = i;
В первом примере ключевое слово else ассоциируется с внутренним условным оператором if. Если i меньше или равно нулю, то переменной х ничего не присваивается.
Во втором примере фигурные скобки ограничивают внутренний условный оператор if и тем самым делают конструкцию else частью внешнего условного оператора if. Если i меньше или равно нулю, то переменной х присваивается значение i.
Оператор пошагового цикла for
Синтаксис:
for([<начальное-выражение>]; [<условное-выражение>]; [<выражение-приращения>])
<оператор>
Действие:
Тело оператора цикла for выполняется до тех пор, пока <условное-выражение> не станет ложным. Если оно изначально ложно, то тело цикла не будет выполнено ни разу. <Начальное-выражение> и <выражение-приращения> обычно используются для инициализации и модификации параметров цикла или других значений.
Первым шагом при выполнении оператора цикла for является вычисление начального выражения, если оно имеется. Затем вычисляется условное выражение и производится его оценка следующим образом: