Операнды и операции
Комбинация знаков операций и операндов, результатом которой является определенное значение, называется выражением. Знаки операций определяют действия, которые должны быть выполнены над операндами. Каждый операнд в выражении может быть выражением. Значение выражения зависит от расположения знаков операций и круглых скобок в выражении, а также от приоритета выполнения операций.
В языке СИ присваивание также является выражением, и значением такого выражения является величина, которая присваивается.
При вычислении выражений тип каждого операнда может быть преобразован к другому типу. Преобразования типов могут быть неявными, при выполнении операций и вызовов функций, или явными, при выполнении операций приведения типов. Например, (double)(a+b).
Операнд — это константа, идентификатор, вызов функции, индексное выражение, выражение выбора элемента или более сложное выражение, сформированное комбинацией операндов, знаков операций и круглых скобок. Любой операнд, который имеет константное значение, называется константным выражением. Каждый операнд имеет тип.
Вызов функций состоит из выражения, за которым следует необязательный список выражений в круглых скобках:
выражение-1 ([ список выражений ])
Значением выражения-1 должен быть адрес функции (например, идентификатор функции). Значения каждого выражения из списка выражений передается в функцию в качестве фактического аргумента. Операнд, являющийся вызовом функции, имеет тип и значение возвращаемого функцией значения.
Выражение выбора элемента применяется, если в качестве операнда надо использовать элемент структуры или объединения. Такое выражение имеет значение и тип выбранного элемента. Рассмотрим две формы выражения выбора элемента:
выражение.идентификатор,
выражение->идентификатор.
В первой форме выражение представляет величину типа struct или union, а идентификатор — это имя элемента структуры или объединения. Во второй форме выражение должно иметь значение адреса структуры или объединения, а идентификатор — именем выбираемого элемента структуры или объединения.
Обе формы выражения выбора элемента дают одинаковый результат. Действительно, запись, включающая знак операции выбора (->), является сокращенной версией записи с точкой для случая, когда выражению стоящему перед точкой предшествует операция разадресации (*), примененная к указателю, т.е. запись
выражение —> идентификатор
эквивалентна записи
(* выражение).идентификатор
в случае, если выражение является указателем.
Пример:
struct tree { float num;
int spisoc[5];
struct tree *left; } tr[5] , elem ;
elem.left = & elem;
В приведенном примере используется операция выбора (.) для доступа к элементу left структурной переменной elem. Таким образом элементу left структурной переменной elem присваивается адрес самой переменной elem, т.е. переменная elem хранит ссылку на себя саму.
Приведение типов это изменение (преобразование) типа объекта. Для выполнения преобразования необходимо перед объектом записать в скобках нужный тип:
( имя-типа ) операнд.
Приведение типов используются для преобразования объектов одного скалярного типа в другой скалярный тип. Однако выражению с приведением типа не может быть присвоено другое значение.
Пример:
int i;
bouble x;
b = (double)i+2.0;
В этом примере целая переменная i с помощью операции приведения типов приводится к плавающему типу, а затем уже участвует в вычислении выражения.
Константное выражение — это выражение, результатом которого является константа. Операндом константного выражения могут быть целые константы, символьные константы, константы с плавающей точкой, константы перечисления, выражения приведения типов, выражения с операцией sizeof и другие константные выражения. Однако на использование знаков операций в константных выражениях налагаются следующие ограничения:
1. В константных выражениях нельзя использовать операции присваивания и последовательного вычисления (,) .
2. Операция "адрес" (&) может быть использована только при некоторых инициализациях.
Выражения со знаками операций могут участвовать в выражениях как операнды. Выражения со знаками операций могут быть унарными (с одним операндом), бинарными (с двумя операндами) и тернарными (с тремя операндами).
Унарное выражение состоит из операнда и предшествующего ему знаку унарной операции и имеет следующий формат:
знак-унарной-операции операнд.
Бинарное выражения состоит из двух операндов, разделенных знаком бинарной операции:
операнд1 знак-бинарной-операции операнд2.
Тернарное выражение состоит из трех операндов, разделенных знаками тернарной операции (?) и (:), и имеет формат:
операнд1 ? операнд2 : операнд3 .
Операции. По количеству операндов, участвующих в операции, операции подразделяются на унарные, бинарные и тернарные.
В языке Си имеются следующие унарные операции:
- арифметическое отрицание (отрицание и дополнение);
~ побитовое логическое отрицание (дополнение);
! логическое отрицание;
* разадресация (косвенная адресация);
& вычисление адреса;
+ унарный плюс;
++ увеличение (инкремент);
-- уменьшение (декремент);
sizeof размер.
Унарные операции выполняются справа налево.
Операции увеличения и уменьшения увеличивают или уменьшают значение операнда на единицу и могут быть записаны как справа, так и слева от операнда. Если знак операции записан перед операндом (префиксная форма), то изменение операнда происходит до его использования в выражении. Если знак операции записан после операнда (постфиксная форма), то операнд вначале используется в выражении, а затем происходит его изменение.
В отличие от унарных, бинарные операции, список которых приведен в табл. 7, выполняются слева направо.
Таблица 7
Знак операции | Операция | Группа операций |
* | Умножение | Мультипликативные |
/ | Деление | |
% | Остаток от деления | |
+ | Сложение | Аддитивные |
- | Вычитание | |
<< | Сдвиг влево | Операции сдвига |
>> | Сдвиг вправо | |
< | Меньше | Операции отношения |
<= | Меньше или равно | |
>= | Больше или равно | |
== | Равно | |
!= | Не равно | |
& | Поразрядное И | Поразрядные операции |
| | Поразрядное ИЛИ | |
^ | Поразрядное исключающее ИЛИ | |
&& | Логическое И | Логические операции |
|| | Логическое ИЛИ | |
, | Последовательное вычисление | Последовательного вычисления |
= | Присваивание | Операции присваивания |
*= | Умножение с присваиванием | |
/= | Деление с присваиванием | |
%= | Остаток от деления с присваиванием | |
-= | Вычитание с присваиванием | |
+= | Сложение с присваиванием | |
<<= | Сдвиг влево с присваиванием | |
>>= | Сдвиг вправо присваиванием | |
&= | Поразрядное И с присваиванием | |
|= | Поразрядное ИЛИ с присваиванием | |
^= | Поразрядное исключающее ИЛИ с присваиванием |
Левый операнд операции присваивания должен быть выражением, ссылающимся на область памяти (но не объектом, объявленным с ключевым словом const), такие выражения называются леводопустимыми, к ним относятся:
- идентификаторы данных целого и плавающего типов, типов указателя, структуры, объединения;
- индексные выражения, исключая выражения имеющие тип массива или функции;
- выражения выбора элемента (->) и (.), если выбранный элемент является леводопустимым;
- выражения унарной операции разадресации (*), за исключением выражений, ссылающихся на массив или функцию;
- выражение приведения типа если результирующий тип не превышает размера первоначального типа.
При записи выражений следует помнить, что символы (*), (&), (!), (+) могут\ обозначать унарную или бинарную операцию.
Дата добавления: 2016-07-27; просмотров: 2610;