Операции и выражения
Как все знают, из переменных, функций и констант в алгебре можно составлять формулы. Точно так же и в языке 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 | слева направо |