Управление последовательностью действий
Операции
При вычислении выражений учитывается приоритет операций: сначала выполняются операции с более высоким приоритетом.
Вычисление выражений, имеющих операции с одинаковым приоритетом, производится в соответствии с правилом сочетательности, которое определяет порядок выполнения таких операций. В языке С сочетательность операций применяется как слева направо, так и справа налево (как и при вычислении возведения в степень). Порядок вычисления справа налево означает, что выражение x** 2**4 трактуется как x**(2**4).
В следующей таблице приведены в убывающем порядке уровни приоритета операций языка С.
| Уровни приоритета | Операции | Порядок выполнения операций |
|---|---|---|
| Скобки | ( ), [ ] | слева направо |
| Индексы, вызов функций | x[i], fun() | слева направо |
| Постфиксный инкремент и декремент | ++, -- | слева направо |
| Префиксный инкремент и декремент | ++, -- | слева направо |
| Унарный минус | - | слева направо |
| Поразрядное отрицание (NOT) | ~ | слева направо |
| Размер объекта | sizeof | слева направо |
| Логическое отрицание | ! | слева направо |
| Получение адреса и разименование | &, * | справа налево |
| Явное приведение типа | (any_type) | слева направо |
| Умножение, деление, деление по модулю | *, /, % | слева направо |
| Сложение, вычитание | +, - | слева направо |
| Сдвиг влево, сдвиг вправо | <<, >> | слева направо |
| Сравнение (меньше, больше, меньше или равно, больше или равно) | <, >, <=, >= | слева направо |
| Сравнение (тождественное равенство, неравенство) | ==, != | слева направо |
| Поразрядное логическое И | & | слева направо |
| Поразрядное исключающее ИЛИ (XOR) | ^ | слева направо |
| Поразрядное логическое ИЛИ | | | слева направо |
| Логическое И (AND) | && | слева направо |
| Логическое ИЛИ (OR) | || | слева направо |
| Условная операция | ?: | справа налево |
| Операция перед присваиванием | =, +=, -=, *=, /=, %=, <<=, >>=, &=, ^=, |= | справа налево |
Операции AND, OR, NOT и XOR относятся к логическим операциям. Следующая таблица показывает результаты применения логических операций.
| x | y | x && y (x AND y) | x || y (x OR y) | ! x (NOT y) | x ^ y (x XOR y) |
|---|---|---|---|---|---|
| 0 ( false ) | 0 ( false ) | 0 | 0 | 1 | 0 |
| 0 ( false ) | 1 ( true ) | 0 | 1 | 1 | 1 |
| 1 ( true ) | 0 ( false ) | 0 | 1 | 0 | 1 |
| 1 ( true ) | 1 ( true ) | 1 | 1 | 0 | 0 |
Единственной операцией, имеющей три операнда, является операция "условие" (называемая также условной операцией).
Условная операция имеет следующий формальный синтаксис:
(expr_log) ? expr1:expr2.
Если выражение expr_log принимает значение true, то условная операция возвращает значение expr1, а если false, то значение expr2.
Например:
// x примет значение 1, если y>z. x=(y>z)? 1:0;
Операции сдвига целочисленного значения выполняют сдвиг всех битов операнда, указанного слева, на число позиций, заданных операндом, указанным справа, а вместо сдвинутых битов записываются нули. Операции сдвига имеют следующий формальный синтаксис:
value<<count_of_position value>>count_of_position.
Например, выражение 9<<2 вычисляется следующим образом: число 9 имеет в двоичном представлении значение 001001 ( 118 ) и при сдвиге его на два разряда влево получается значение 100100 ( 448 ).
Операции инкремента и декремента соответственно увеличивают или уменьшают значение операнда на 1. Различают постфиксный и префиксный инкремент и декремент. Например, выражение x++ возвращает значение переменной х, а затем увеличивает его на 1, а выражение ++x увеличивает значение x на 1 и возвращает его.
Операция присваивания в различных языках имеет разное обозначение. Так, в языках С, C++, Java операция присваивания обозначается символом =. Например, x=y+z;. Язык С позволяет в одном операторе указывать несколько операций присваивания. Например: x1=x2=y+z;. В языках Pascal и ALGOL операция присваивания указывается символами :=. Например: x:=y+z ;. В языке LISP операция присваивания обозначается функцией SETQ (например, (SETQ x (PLUS y z)) ).