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


Операторы

Операторами в Си являются:

· составной оператор

· выражение;

· 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; просмотров: 1207;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.011 сек.