Операторы управления и локализация имен
Операторы
Операторами в Си являются:
· составной оператор
· выражение;
· if(выражение) оператор [else оператор]
· while (выражение) оператор
· do оператор while (выражение);
· for ([выражение1];[ выражение2];[ выражение3]) оператор
· switch (выражение) оператор
· case константное выражение : список операторов
· default : оператор
· break;
· continue;
· return [выражение];
· goto идентификатор_метка;
· идентификатор_метка : оператор;
Так же как и раньше […] ограничивают необязательные конструкции. Это так называемые метасимволы. Большинство из операторов имеют свои аналоги в других языках программирования и их семантика ясна. Остановимся только на некоторых особенностях.
Произвольное выражение, заканчивается “;” является оператором. Такая точка зрения на выражение подразумевает воздействие на состояние программы, определяемое содержимым памяти. Таких ситуаций несколько.
Примеры
i++; /*инкремент*/
(void)fculc(arr,j);/*вызов функции с побочным эффектом*/
a*=b+c; /*присваивание*/
Функции с побочным эффектом те, которые не только возвращают значение, но и изменяют значения внешних по отношению к функциям переменных.
Составной оператор
Составной оператор (или блок) имеет следующий вид:
{[список_описаний] [список_операторов]}, где любой из списков представлен последовательностью элементов, разделенных точкой с запятой.
В случае отсутствия списка описаний такая конструкция трактуется как составной оператор, объединенный последовательностью операторов в единое целое. Основное назначение составного оператора – это использование его в качестве тела цикла, тела переключателя или пунктов then и else в if – операторе.
Добавление описаний повышает статус составного оператора. Он рассматривается как блок с локализованными описаниями переменных и меток. Локальная переменная или метка вычеркивают из списка доступную в блоке внешнюю переменную или метку по отношению к блоку с теми же именами.
Пример
label : …..{
…….
goto label;
……….. переход
label: ……..
}
Задача
Куда будет выполнен переход?
label : …….goto label;
……….
{…..label: …….}
Пустой оператор
Точка с запятой: трактуется как пустой оператор или как синтаксический оператор следования. Он используется в тех случаях, когда в соответствии с определением синтаксиса требуется оператор, но по логике программы никаких действий выполнять не требуется. Такими конструкциями являются: if, while, do, for, switch, case, default, идентификатор_метка: оператор.
Пример
Пропуск пустых символов:
while((c=getchar( ))==’’|| c==’\n’ || c==’\t’)
;
for (i=0; s[i]==’’ || s[i]==’\n’ || s[i]==’\t’;i++)
;
Пример
If (!a&&!b || !c); else {……};
Цикл do-while
Используется, когда тело цикла необходимо выполнить, по меньшей мере, 1 раз.
Синтаксическая форма оператора:
do
оператор
while(выражение);
Выполняется оператор, а затем вычисляется выражение. Если оно ложно, то есть равно 0, то цикл заканчивается, если истинно, то снова выполняется оператор и так далее.
Семантика отличается от циклов похожего вида repeat-until в других языках программирования.
Пример
Простой while из предыдущего примера можно переписать так:
do {
c= getchar( );
} while (c==’’ || c==’\n’ || c==’\t’);
Рекомендуется использовать составной оператор после do даже в случае единственного оператора для более наглядного представления этой конструкции в программе.
Цикл for
Синтаксическая форма оператора следующая:
for([выражение1]; [выражение2]; [выражение3]) оператор;
В соответствии с определением любое из трех выражений в операторе for может быть пропущено.
Пример
for (;;){….}
Если отсутствует выражение2, то считается, что проверка всегда дает истину и это потенциально бесконечный цикл. Из такого цикла необходимо выходить, например, операторами break, goto или return.
Прочие операторы
Оператор continue применим только к циклам и, так же как и в других языках, он задает пропуск оставшейся части тела цикла и переход к следующей итерации.
Оператор switch используется в сочетании с другими операторами – case, default и break. Его семантика отличается от того, что имеется в других языках программирования. Характерной чертой его в С является сквозное управление, то есть, когда управление получает оператор case, то выполняются дальше подряд все операторы до конца тела оператора switch, что может служить истоком логических ошибок. Указанную последовательность вычислений в необходимых случаях следует прерывать оператором break.
Пример
Часть программы, связанная с подсчетом цифр, пробелов, конца строки, табуляции и прочих символов, может быть представлена следующим образом :
// ndigit - целочисленный массивна 10 элементов, nother и nwrite – целочисленные скалярные // переменные и c – переменная типа char
do
switch(c=getchar( )){
case ‘0’:
case ‘1’:
case ‘2’:
-----------
case ‘9’: ndigit[c-‘0’]++;
break;
case ‘’:
case ‘\n’:
case ‘\t’: nwite++;
break;
default: nother++;
break;
} while(c!=EOF);
printf(“digits = ”);
for (i=0;i<10;i++)
printf(“%d”, ndigit[i]);
printf(“\nwite space = %d”, other = “%d\n”, nwite, --nother);
В данном фрагменте используется выражение --nother, чтобы не учитывать EOF. Если бы break отсутствовал, то логика программы была бы нарушена. Так в случае с=’9’, 1 добавлялась бы к ndigit[9], к nwite и к nother.
Оператор break вызывает выход из переключателя. Он вызывает также разрыв ближайших объемлющих циклов do, while или for.
Отметим, что этот оператор имеет ограниченную форму по сравнению с тем, что имеется в других языках программирования. Так в более мощных языках программирования break может содержать метку цикла либо выражение, определяющее число циклов, которые необходимо “разорвать”. Такая ограниченная форма компенсируется в языке С наличием оператора goto.
Дата добавления: 2016-05-26; просмотров: 1322;