Операции и выражения
Как все знают, из переменных, функций и констант в алгебре можно составлять формулы. Точно так же и в языке C++ следующим уровнем представления данных после одиночных переменных и констант являются своего рода формулы, называемые выражениями.
Единственное отличие выражений C++ от конвенциональных формул заключается в том, что набор операций, соединяющих члены выражения, отличается от применяемого, скажем, в алгебре. Вот один пример выражения:
aResult = (first - second * RATE) <<3
Операции характеризуются своим приоритетом, определяющим порядок, в котором производится оценка выражения, и правилом ассоциации, задающим направление последовательных оценок идущих друг за другом операций одного приоритета.
Как и в обычных формулах, для изменения порядка оценки выражения могут применяться круглые скобки (кстати, в приведенном выражении они излишни и введены только для наглядности). Знак равенства здесь также является операцией присваивания, которая сама (и, соответственно, все выражение в целом) возвращает значение. В этом отличие С от других языков, в частности Pascal, где присваивание является оператором а не операцией. Оператором выражение станет, если поставить после него точку с запятой.
В следующей таблице дана сводка всех операций языка С в порядке убывания приоритета.
Таблица 3.3. Операции языка С
Операция |
Описание |
Приоритет |
Ассоциация |
||||
Первичные и постфиксные операции |
|||||||
[] | индексация массива | 16 | слева направо | ||||
() | вызов функции | 16 | слева направо | ||||
. | элемент структуры | 16 | слева направо | ||||
-> | элемент указателя | 16 | слева направо | ||||
++ | постфиксный инкремент | 15 | слева направо | ||||
-- | постфиксный декремент | 15 | слева направо | ||||
Одноместные операции |
|||||||
++ | префиксный инкремент | 14 | справа налево | ||||
-- | префиксный декремент | 14 | справа налево | ||||
sizeof | размер в байтах | 14 | справа налево | ||||
(тип) | приведение типа | 14 | справа налево | ||||
~ | поразрядное NOT | 14 | справа налево | ||||
! | логическое NOT | 14 | справа налево | ||||
- | унарный минус | 14 | справа налево | ||||
& | взятие адреса | 14 | справа налево | ||||
* | разыменование указателя | 14 | справа налево | ||||
Двухместные и трехместные операции |
|||||||
Мультипликативные |
|||||||
* | умножение | 13 | слева направо | ||||
/ | деление | 13 | слева направо | ||||
% | взятие по модулю | 13 | слева направо | ||||
Аддитивные |
|||||||
+ | сложение | 12 | слева направо | ||||
- | вычитание | 12 | слева направо | ||||
Поразрядного сдвига |
|||||||
<< | сдвиг влево | 11 | слева направо | ||||
>> | сдвиг вправо | 11 | слева направо | ||||
Отношения |
|||||||
< | меньше | 10 | слева направо | ||||
<= | меньше или равно | 10 | слева направо | ||||
> | больше | 10 | слева направо | ||||
>= | больше или равно | 10 | слева направо | ||||
== | равно | 9 | слева направо |
Операция |
Описание |
Приоритет |
Ассоциация |
! = | не равно | 9 | слева направо |
Поразрядные |
|||
& | поразрядное AND | 8 | слева направо |
^ | поразрядное XOR | 7 | слева направо |
| | поразрядное OR | 6 | слева направо |
Логические |
|||
&& | логическое AND | 5 | слева направо |
|| | логическое OR | 4 | слева направо |
Условные |
|||
? : | условная операция | 3 | справа налево |
Присваивания |
|||
= | присваивание | 2 | справа налево |
*= | присвоение произведения | 2 | справа налево |
/= | присвоение частного | 2 | справа налево |
%= | присвоение модуля | 2 | справа налево |
+= | присвоение суммы | 2 | справа налево |
-= | присвоение разности | 2 | справа налево |
<<= | присвоение левого сдвига | 2 | справа налево |
>>= | присвоение правого сдвига | 2 | справа налево |
&= | присвоение AND | 2 | справа налево |
^= | присвоение XOR | 2 | справа налево |
|= | присвоение OR | 2 | справа налево |
, | запятая | 1 | слева направо |