Операторы и их классификация
Оператор – это программная конструкция, обеспечивающая выполнение в программе определенных действий с данными. После каждого оператора в программе на С++ должна ставиться точка с запятой.
Различают следующие виды операторов:
· описания объектов
· оператор вычисления выражения
· операторы ветвления
· операторы цикла
· операторы передачи управления
· вызова функции
Описания объектов относят к неисполняемым операторам. Все остальные операторы называются исполняемыми операторами.
Любое выражение, выполняющее вычисление определенного значения, и заканчивающееся точкой с запятой, рассматривается как оператор.
Примеры:
i++; // выполняется операция инкремента
a*=b + c; // выполняется умножение с присваиванием
Частным случаем выражения является пустой оператор – знак точка с запятой. Этот оператор не выполняет никаких действий. Ставится там, где синтаксис предлагает наличие оператора, но при каких-либо операций выполнять не требуется.
Операторы ветвления, цикла, передачи управления и вызова функции будут подробно рассмотрены в следующих лекциях.
По характеру действий различают два типа операторов: операторы преобразования данных и операторы управления работой программы (управляющие конструкции программы).
К операторам преобразования относятся операторы описания объектов, вычисления выражения и вызова функции, к управляющим конструкциям – операторы ветвления, цикла и передачи управления.
Операторы могут объединяться в группы – составные операторы и блоки. Составной оператор и блок – это последовательность операторов, заключенная в фигурные скобки (точка с запятой в конце не ставится). Синтаксически составные операторы и блоки выступают в качестве одного оператора.
Отличие составного оператора от блока заключается в том, что составной оператор включает только исполняемые операторы, а блок - также описания объектов.
Пример составного оператора:
{
n++;
summa+=(float)n;
}
Пример блока:
{
int n=0;
n++;
summa+=(float)n;
}
Все операторы программы выполняются последовательно в порядке записи их в программе (сверху вниз, слева направо), если нет операторов передачи управления, изменяющих этот порядок.
Операторы могут быть вложены друг в друга. В интересах быстрой интерпретации и минимизации ошибок вложенность операторов обозначается отступами.
Тема 1.8
Операторы ветвления
Условный оператор if
Условный оператор if используется для разветвления процесса вычислений на два направления.
Формат оператора: if ( выражение ) оператор_1; [else оператор_2;]
Структурная схема оператора приведена на рисунке 1.4.
Сначала вычисляется выражение, которое может иметь арифметический тип или тип указателя. Если оно не равно нулю (имеет значение true), выполняется первый оператор, иначе — второй. После этого управление передается на оператор, следующий за условным. Вторая ветвь вместе с ключевым словом else может отсутствовать. Подобная конструкция называется «пропуск оператора».
Если в какой-либо ветви требуется выполнить несколько операторов, их необходимо заключить в блок, иначе компилятор не сможет понять, где заканчивается ветвление. Блок может содержать любые операторы, в том числе описания и другие условные операторы, но не может состоять из одних описаний. Необходимо учитывать, что переменная, описанная в блоке, вне блока не существует.
Рисунок 1.4 - Структурная схема условного оператора
Примеры:
if (a < 0) b = 1; // 1
if (a < b && (a>d || a = = 0)) b++; else {b *= a; a = 0;} // 2
if (a < b) {if (a < c) m = a; else m = c;} else {if (b < c) m = b; else m = c;} // 3
if (a++) b++; // 4
if (b > a) max = b; else max = a; // 5
В примере 1 отсутствует ветвь else - присваивание либо выполняется, либо пропускается в зависимости от выполнения условия.
Если требуется проверить несколько условий, их объединяют знаками логических операций. Например, выражение в примере 2будет истинно в том случае, если выполнится одновременно условие a < b и одно из условий в скобках. Если опустить внутренние скобки, будет выполнено сначала логическое И, а потом — ИЛИ.
Оператор в примере 3вычисляет наименьшее значение из трех переменных. Фигурные скобки в данном случае не обязательны, так как компилятор относит часть else к ближайшему if.
Пример 4 иллюстрирует то, что хотя в качестве выражений в операторе if чаще всего используются операции отношения, это не обязательно.
Конструкции, подобные оператору в примере 5, проще и нагляднее записывать в виде условной операции (в данном случае: max = (b > а) ? b : a;).
Распространенная ошибка при записи условных операторов — использование в выражениях вместо проверки на равенство (= =) простого присваивания (=), например, if (a = 1) b = 0;. Синтаксической ошибки нет, так как операция присваивания формирует результат (true или false, преобразованное в int), который и оценивается на равенство/неравенство нулю. В данном примере присваивание переменной b будет выполнено независимо от значения переменной а. Поэтому в выражениях проверки переменной на равенство константе константу рекомендуется записывать слева от операции сравнения: if (1= = a) b=0;.
Вторая ошибка — неверная запись проверки на принадлежность диапазону. Например, чтобы проверить условие 0 < х < 1, нельзя записать его в условном операторе непосредственно, так как будет выполнено сначала сравнение 0 < x, x а его результат (true или false, преобразованное в int) будет сравниваться с 1. Правильный способ записи: if(0 < х && х < 1).
Если какая-либо переменная используется только внутри условного оператора, рекомендуется объявить ее внутри скобок, например: if (int i = fun(t)) a -= i; else a += i;. Объявлять внутри оператора if можно только одну переменную. Область ее видимости начинается в точке объявления и включает обе ветви оператора. Объявление переменной в тот момент, когда ей необходимо присвоить значение позволяет избежать случайного использования переменной до ее инициализации.
Пример: Производится выстрел по мишени, изображенной на рисунок 1.5. Определить количество очков.
Рисунок 1.5 - Мишень
#include <iostream.h>
int main( ){
float x, у; int kol;
cout << "Введите координаты выстрела\n";
cin >> x >> у;
if ( x*x + y*y < 1 ) kol = 2;
else if ( x*x + y*y < 4 ) kol = 1;
else kol =0;
cout << "\n Очков: " << kol;
return 0;
}
Программу можно еще упростить с помощью промежуточной переменной и записи условия в виде двух последовательных, а не вложенных, операторов if.
#include <iostream.h>
int main( ){
float x, y, temp; int kol;
cout << "Введите координаты выстрела\n";
cin >> x >> у;
temp = x*x + y*y;
kol = 0;
if (temp < 4 ) kol = 1;
if (temp < 1 ) kol = 2;
cout << "\n Очков: " << kol;
return 0;
}
В первом варианте значение переменной kol присваивается ровно один раз, а во втором — от одного до трех раз в зависимости от выполнения условий.