Определение и общая классификация операторов

Дадим следующее определение оператора.

Оператор – это языковая конструкция, представляющая шаг из последовательности действий или описаний (оператор задает законченное описание некоторого действия), оператор всегда завершается «;», за исключение составного оператора или блока. (Элементы заголовка цикла for, после которых ставится «;» оператором считать не будем).

Далее будем использовать именно этот термин в качестве понятия «оператор». Следует отметить, что с термином «оператор» в литературе присутствует некоторая терминологическая путаница. В некоторой, особенно переводной литературе, пол термином «оператор» часто понимают операции, обозначаемые знаками «+», «-», «*», «/», «=», …. из- за английского термина “operator”. Термины «оператор» и «операция» будем разделять.

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

Операторы разделим на два основных класса:

– последовательно выполняемые операторы;

– управляющие конструкции (операторы).

В данной лекции остановимся на последовательно исполняемых операторах.

 

Последовательно выполняемые операторы

Последовательно выполняемые операторы при выполнении тела функции выполняются последовательно друг за другом. Можно привести следующую классификацию последовательно выполняемых операторов:

операторы – объявления, например, объявления переменных, рассмотренные в лекции 2:

int i, j, k=10; double x, y;

операторы – выражения, строятся из операндов и знаков операций, выражение задает правило вычисления некоторого значения, проведем следующую классификацию выражений:

•  на базе операции присваивания «=»: x=y+10;

• на базе операций инкремент, декремент (++ --): i++; --j;

• вызов функции: f1();

• комбинированные выражения: x=i++ + f();

составной оператор – это последовательность операторов, заключенных в фигурные скобки { }, синтаксически составной оператор воспринимается как отдельный оператор;

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

Перед любым оператором может ставиться метка. Метка это идентификатор, после которого ставится символ «:»

Met1: x=x+y;

Область действия метки – тело функции, имя метки должно быть уникальным внутри тела функции.

 

Операции языка Си

Из операций и операндов строятся операторы- выражения, которые служат для получения значения. Рассмотрим основные операции, которые будем разделять на следующие классы: унарные, применяются к одному операнду; бинарные, применяются к двум операндам; тернарная операция (единственная), применяется к трем операндам. Некоторые операции просто будут перечислены, а более подробно будут рассмотрены позднее.

Унарные операции:

«-» - «унарный минус» применяется к арифметическим операндам (целым, вещественным переменным или константам), результат операции значение операнда с противоположным знаком;

«+» - «унарный плюс» операция ничего не делает, введена для симметрии с операцией «унарный минус»;

«*» - «обращение по адресу», операция применяется к указателям, результат операции значение объекта (операнда), на который указывает указатель;

«&» - «получение адреса», результат операции – адрес объекта (переменной);

«~» - «поразрядное отрицание» операция применяется только к целым операндам, результат операции целое значение, в котором разряды исходного операнда инвертированы;

«!» - «логическое отрицание» («логическое НЕ»), дает в результате значение 0, если операнд есть истина (не нуль), и значение 1, если операнд равен нулю (в Visual C++ тип результата bool), следует отметить, что в базовом Си стандарта ANSI отсутствовал в явном виде логический тип, который бы принимал 2 значения: «истина» и «ложь», вместо логического типа использовался, как правило, целый тип, значение 0- интерпретировалось, как «ложь», любое значение отличное от 0 являлось «истина»;

(<тип>) – «операция преобразования типа», была рассмотрена ранее;

«sizeof» – операция определения размера предназначена для вычисления размера объекта или типа в байтах, и имеет две формы:

sizeof выражение или sizeof(выражение)

sizeof(тип)

++ - инкремент (увеличение на 1), -- - декремент (уменьшение на 1), имеют две формы записи — префиксную, когда операция записывается перед операндом, и постфиксную. Если операции используются сами по себе (в операторе только одна операция), то разницы между двумя формами нет. Если операция применяется внутри выражения с другими операциями, то в префиксной форме сначала изменяется операнд, а затем его новое значение подставляется в выражение, а в постфиксной форме в выражение подставляется старое значение, а затем изменяется значение операнда. Например,

int i=10, j;

j=++i; // Префиксная форма операции

В результате выполнения данного фрагмента, i и j будут равны 11 (переменной j присваивается новое значение i, увеличенное на 1), если изменить форму операции ++:

int i=10, j;

j=i++; // Постфиксная форма операции

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

Бинарные операции можно разделить на следующие классы:

Арифметические:

«+» - бинарный плюс;

«-» - бинарный минус;

«*» - умножение;

«/» - деление;

% - получение остатка от деления.

Первые четыре операции применяются к арифметическим операндам: целым или вещественным, операции «+» и «-» ограниченным способом могут применяться к указателям. Операция – «%» применяется только к целым операндам.

Логические:  

«&&» - логическое И;

«||» - логическое ИЛИ;

«^» - логическое исключающее ИЛИ.

Операнды логических операций могут иметь арифметический тип или быть указателями, при этом операнды в каждой операции могут быть различных типов. Преобразования типов не производятся, каждый операнд оценивается с точки зрения его эквивалентности нулю (операнд, равный нулю, рассматривается как «ложь», не равный нулю — как «истина»). В Visual C++ тип результата int или bool в зависимости от типов операндов.

Поразрядные:

«&» - поразрядное И;  

«|» - поразрядное ИЛИ;

«^» - поразрядное исключающее ИЛИ;

«>>» - поразрядный сдвиг вправо;

«<<» - поразрядный сдвиг влево.

Данные операции применяются только к целочисленным операндам и работают с их двоичными представлениями. При выполнении операций «&», «|», «^» операнды сопоставляются побитово (первый бит первого операнда с первым битом второго, второй бит первого операнда со вторым битом второго, и т д.).

Операции сдвига сдвигают двоичное представление первого операнда влево или вправо на количество двоичных разрядов, заданное вторым операндом. При сдвиге влево «<<» освободившиеся разряды обнуляются. При сдвиге вправо «>>» освободившиеся биты заполняются нулями, если первый операнд беззнакового типа, и знаковым разрядом в противном случае.

Отношения (сравнения):

«==» - равно (не путать с операцией присваивания «=»);

«!=» - не равно; 

«>» - больше;

«<» - меньше;

«>=» - больше или равно;

«<=» - меньше или равно.

Операции отношения сравнивают первый операнд со вторым. Операнды могут быть арифметического типа или указателями. Результатом операции является значение «истина» (любое значение не равное 0, как правило, 1) или «ложь» (0). В Visual C++ тип результата bool.

Присваивания:

«=» - простое присваивание.

Первый операнд должен быть L-значением область памяти будет занесен результат операции. второй — выражением. Сначала вычисляется выражение, стоящее в правой части операции, а потом его результат записывается в область памяти, указанную в левой части. Так называемое, L-значение (L- value) (леводопустимое значение, может быть использовано слева от операции присваивания), так обозначается любое выражение, адресующее некоторый участок памяти, в который можно занести значение.

op= (где op – символ бинарной операции) – комбинированное присваивание, комбинация бинарное операции с операцией присваивания, например, «+=» - присваивание со сложением, по аналогии существуют операции: «*=», «/=», «-=», «%=», «&=», «|=», «^=» и др. Комбинированные операции работают по следующему правилу:

i+=10;  аналогично i=i+10;

Другие бинарные операции, просто их перечислим:

() – вызов функции;

[ ] – обращение к элементу массива;

«.» («точка») – обращение к полю переменной структурного типа;

«->» - обращение к полю переменной структурного типа через указатель;

«,» («запятая») – последовательное вычисление, может ставится между выражениями, выражения вычисляются последовательно, результат операции результат второго операнда (выражения).

Тернарная операция:

«?:» - условная операция.       

Формат: <операнд1>? <операнд2>: <операнд3>

Первый операнд имеет тип, заменяющий логический – арифметический или указатель, если первый операнд имеет значение «истинно», то результат операции – значение второго операнда, а если «ложь», то результат операции значение третьего операнда. Пример,

y= x>=0? x: -x;

переменной y присваивается значения модуля переменной x.

 


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: