Операции и операторы
Функциональные возможности любого языка программирования состоят из набора разрешенных операций, из которых можно собрать работающие операторы, и библиотечных функций, включенных в состав этого языка.
Под операцией в языке С понимают какое-либо действие над данными.
Каждая операция однозначно характеризуется знаком операции и количеством операндов.
Знак операции – это символ или служебное слово, которые приводят к выполнению того или иного действия.
Примером знака операции могут служить +, -, *, =, sizeof() и т.д.
Операнд – это данные, участвующие в операции.
Операция не является аналогом оператора. Оператор – это законченная команда компьютера на языке программирования для получения однозначного результата. Операции являются частью оператора, а не наоборот.
Количество операндов важно. В языке С некоторые из знаков операций неоднозначны. В этом случае количество операндов влияет на то, какая из возможных операций будет выполнена.
Некоторые операции чувствительны к типу операндов. В случае неправильно применения обычно появляется сообщение о принудительном преобразовании типа операнда. Если решение о приведение к типу операнда не может быть принято, то появляется ошибка компиляции. Следует помнить, что у большинства операций тип результата операции тот же, что и тип ее операндов.
Если в бинарной операции участвуют операнды различных типов, то перед выполнением операции "низший" тип преобразуется к "высшему" и получается результат "высшего" типа. Более точно, к каждой арифметической операции применяется следующая последовательность правил преобразования.
a) типы char и short преобразуются в int, а float в double;
b) если один из операндов имеет тип double, то другой преобразуется в double, и результат имеет тип double;
c) если один из операндов имеет тип long, то другой преобразуется в long, и результат имеет тип long;
d) все переменные типа float в выражениях преобразуются в double; в языке C вся плавающая арифметика выполняется с двойной точностью.
Длинные целые преобразуются в более короткие целые и в переменные типа char посредством отбрасывания лишних битов высокого порядка.
Символьные переменные преобразуются в целые либо со знаковым расширением, либо без него, как описано выше. Обратное преобразование int в char ведет себя хорошо – лишние биты высокого порядка просто отбрасываются. Таким образом:
int i;
char c;
i = c;
c = i;
значение с не изменяется. Это верно независимо от того, вовлекается ли знаковое расширение или нет.
Если х типа float, а i типа int, то, как х = i, так и i = х; приводят к преобразованиям; при этом float преобразуется в int отбрасыванием дробной части. Тип double преобразуется во float округлением.
Операции можно группировать по разным признакам. Если рассматривать критерием группировки место применения, то операции могут быть:
- математические – используются для математических вычислений;
- логические – используются для построения сложных условий;
- отношений – используются для сравнения данных (те же условия);
- побитовые – выполняющие преобразования данных по битам;
- доступа – позволяющие получить данные из сложных типов данных
- некоторые другие – сюда можно отнести операции приведения к типу, выделение и очистка памяти, определения размера данных и т.д.
Если использовать критерием группировки количество операндов, то операции будут:
- унарные – работают с одним операндом;
- бинарные – имеют два операнда;
- тернарные – используют три оператора.
Правильное (выполняемое) объединение операндов и операций называют выражением.
В выражении могут использоваться парные круглые скобки ().