Основные сведения об условных операторах
Лабораторная работа № 3
ПРОГРАММИРОВАНИЕ УСЛОВНЫХ ОПЕРАТОРОВ И ОПЕРАТОРОВ ЦИКЛА
Введение
В языке Си понятие оператора трактуется шире, чем в других языках, поскольку не делается существенного различия между оператором и арифметическим выражением. Другими словами, любое арифметическое выражение, заканчивающееся точкой с запятой, является оператором языка Си, например:
a/b;
Поскольку результат деления не присваивается никакой переменной, он теряется, но действия будут произведены.
Каждый оператор языка Си обязательно заканчивается точкой с запятой. Этот символ не отделяет операторы друг от друга, а является неотъемлемой завершающей частью любого оператора.
Группа операторов, заключенных в общие фигурные скобки, образует составной оператор, иначе называемый б л о к о м . Ограничителем блока является закрывающая фигурная скобка, поэтому точка с запятой после блока не нужна. Однако внутри блока каждый оператор должен оканчиваться точкой с запятой, в том числе и последний. На количество операторов в блоке и на их тип не накладывается никаких ограничений.
Действие составного оператора заключается в последовательном выполнении всех составляющих его операторов за исключением случая, когда один из них явно передает управление в другое место программы.
Составной оператор рассматривается в программе как цельная конструкция и может использоваться везде, где синтаксис разрешает запись одиночного оператора.
В начале любого блока (до первого оператора) разрешается описывать и объявлять любые объекты программы, которые будут локальными для данного блока.
Любой оператор блока может иметь метку. В принципе на такую метку разрешена передача управления даже извне блока. Это следует делать осмотрительно, поскольку происходит обход объявлений локальных переменных и всех операторов, расположенных выше по тексту.
Основные сведения об условных операторах
Во многих случаях последовательность выполнения операторов программы не может быть однозначно определена до начала расчетов. Часто выбор следующего действия зависит от значения некоторого промежуточного результата. Подобный вычислительный процесс называется разветвляющимся.
Простейшим примером разветвляющегося процесса может служить,например, вычисление такой функции:
0 если x <= 0
y =
x если x > 0
В структурную схему алгоритма вычислений включается логический блок, обеспечивающий разветвление по двум возможным направлениям:
да нет
В тексте программы такому алгоритму соответствует условный оператор:
if(условие) оператор_1;
else оператор_2;
Если условие (или выражение, записанное вместо него) истинно, то выполняется оператор_1, в противном случае выполняется оператор_2. В качестве любого оператора может быть записан составной оператор, т.е. блок.
Конкретно для нашего случая, оператор запишется так:
if(x <= 0) y = 0;
else y = x;
Часто, но не всегда, условие представляет собой два арифметических выражения, соединенных одним из знаков операции отношения:
a == b - a тождественно равно b;
a != b - a не равно b;
a > b - a больше b;
a >= b - a больше или равно b ;
a < b - a меньше b;
a <= b - a меньше или равно b.
Такие условия позволяют сравнивать два операнда. Результат проверки истинности условия – это логическая переменная, которая может принимать одно из двух значений (true – false, т.е. истина - ложь). В языке СИ эти значения адекватны целым числам: истина – единица, ложь - нуль. Поэтому язык СИ разрешает использовать в качестве условий одиночные арифметические выражения(АВ) и даже константы. При этом нулевое значение АВ, независимо от типа – целое или вещественное, трактуется как логическая «ложь», а любое ненулевое – как «истина». Например, вычисление значения функции y = sin(x)/x может быть записано так:
x = ...;
if(x) y = sin(x)/x;
else y = 1.0;
Полезно подумать, почему для вычисления использован условный оператор, а не простое присваивание вида y = sin(x)/x.
Допустимо записывать короткий вариант условного оператора - без ветви else. Такой оператор при ложности условия не выполняет никаких действий.
Запишем фрагмент реализации разветвления с помощью короткого условного оператора. Это вполне возможно, несмотря на отсутствие у него ветви «else»:
y = 0;
if(x > 0) y = x;
Обратите внимание на характерный прием: сначала переменной y произвольно присваивается конкретное значение, а потом проверяется, угадали мы или нет. Если отношение x > 0 окажется истинным, то значение «y» перевычисляется.
Условия могут быть достаточно сложными логическими выражениями. В языке СИ есть три стандартные логические операции, обозначаемые следующими символами:
&& - операция И (AND);
|| - операция ИЛИ (OR);
! - операция НЕ (NOT);
Предупреждение. Логические операции И, ИЛИ
не следует путать с одноименными побитовыми
операциями, которые обозначаются одиночными
символами & и | соответственно.
Приведем два примера их использования:
a>b && a<c a>0 || b >0 || !(a==b)
Выполнение логической операции "И"(&&) производится так. Последовательно слева направо вычисляются значения всех операндов. Как только будет найден нулевой операнд, дальнейшие вычисления прекращаются, и все логическое выражение получает значение нуль (т.е."ложь"). Если ни один из операндов не оказался нулевым, логическое выражение получает значение “единица”, которое трактуется как "истина".
Похожим образом выполняется логическая операция "ИЛИ"(||). Последовательное вычисление операндов досрочно прекращается, как только будет найден ненулевой операнд, в результате чего все логическое выражение считается истинным и получает значение “единица”. Нулевым оно будет лишь тогда, когда все операнды также будут иметь нулевое значение.
Вычисление выражений, содержащих только логические
операции, прекращается, как только удается
однозначно определить результат.
Операция логического отрицания "!" может стоять перед целой (или булевой) переменной, изменяя тем самым ее логическое значение на противоположное, т.е. ненулевое значение - на нуль, а нуль - на единицу. Результат выполнения операции имеет тип int.
Например:
int k = 0;
if(!k)
{
........ /* Выполняемые действия */
}
Наиболее часто логические выражения играют роль условий, проверяемых при разветвлении вычислительного процесса или его прекращении:
if(a>b || c>d || e>f) .....