Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Управляющие конструкции С




Лекция 3

Запятая

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

Выражение1, выражение2[,...] - также будет выражением, оценкой которого является значение последнего элемента списка. При этом операция-запятая гарантирует, что оценка выражений в списке будет производиться по порядку слева направо.

i++, j++; - // Значение выражения игнорируется.

res = (j = 4, j += n, j++); - // res присваивается n + 4, j равно n + 5.

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


Существуют всего три основных структуры потока управления:

ü Последовательная структура — следующим исполняется оператор, расположенный непосредственно после текущего.

ü Структура выбора — имеется несколько операторов; в зависимости от оценки некоторого выражения для исполнения выбирается только один из них, остальные игнорируются.

ü Структура повторения — текущий оператор исполняется снова и снова до тех пор, пока не будет удовлетворено некоторое условие завершения.

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

Условный оператор if... else

if (условие) оператор1 else оператор 2

Если условие оценивается как истинное (ненулевое), выполняется onepamop1, если как ложное (нулевое), выполняется onepamop2.

if (а > b)

max_ab = a;

else

max_ab = b;

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

if (а > b) // Если а > b, поменять их местами;

{

temp = а; // в противном случае оставить все, как есть.

а = b;

b = temp;

}

Условие оператора if может быть сколь угодно сложным выражением:

if (x) DoSomething(); // Если х не равно нулю.

if (!x) DoAnotherThing(); // Если х равно нулю.

if (b == с) DoAnotherThing(); // Если b равно с.

if (b!= с) DoSomething(); // Если b не равно с.

if ((key = getch()) == 'q') DoQuitO; // Сохранить код клавиши в key и проверить, равен ли он ' q '.

#define ERR_FLAG 0х80

if (flags & ERR_FLAG) ReportError(); // Если бит ERR_FLAG переменной flags установлен.

if (a >= b && a <= c) DoSomething(); // Если а лежит между b и с.

Операции отношения (==,!=, <, >= и т. д.) возвращают ненулевой целый результат, если значения операндов удовлетворяют отношению. В большинстве реализации С это 1, но полагаться на это не стоит. Если отношение не удовлетворяется, результатом операции будет нуль.

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

Битовые флаги — довольно распространенный и очень эффективный прием хранения и передачи информации о состоянии какого-то объекта или процесса, хотя и не очень безопасный. Вот примеры манипуляций с флагами:

flags | = ERR_FLAG; // Установка флага операцией OR.

flags &= ~ERR_FLAG; // Сброс флага операцией AND.

flags ^= ERR_FLAG; // Переключение флага операцией XOR.

Оператор выбора switch

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

Для подобных случаев в С существует специальная конструкция выбора switch.

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

{

case константное_выражение: группа_операторов

case константное_выражение: группа_операторов

[default: группа операторов] }

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

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

int main(int argc, char* argv[])

{

int key;

loop: //метка;

printf("\nEnter command (F, M or Q): ");

key = getch(); // Прочитать клавишу.

switch (key) // Определение команды... case 'f':

{

case 'F’:

printf("\n\"File\" command selected.\n");

break;

case 'm':

case 'M':

printf ("\n\"Message\" command selected.\n");

break;

case 'q':

case 'Q':

printf("\n\"Quit\" command selected.\n");

printf("\nPress a key to Exit...");

getch();

return 0; // Возврат в Windows.

default: printf("\ninvalid command!\n");

}

goto loop; // Следующая команда.

}

В программе организован простейший “бесконечный” цикл, который все время просит пользователя ввести команду — до тех пор, пока не будет нажата клавиша “Q”. В этом случае происходит возврат в операционную систему.

Чтение команды производится функцией getche(). Она, как и getch (), возвращает код нажатой клавиши, однако в отличие от getch() отображает введенный символ на экране.

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




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


Дата добавления: 2014-01-06; Просмотров: 310; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.013 сек.