|
| 1 | +# Приоритет операторов |
| 2 | + |
| 3 | +=Операторы= -- это символы, которые указывают компилятору на необходимость выполнения какой-нибудь операции с одним или несколькими операндами. |
| 4 | +=Операнд= -- это то, на что воздействует оператор. |
| 5 | + |
| 6 | +```c |
| 7 | +3 + 7 // 3 и 7 -- это операнды, а + -- оператор. |
| 8 | +i++ // i -- операнд, ++ -- оператор |
| 9 | +``` |
| 10 | + |
| 11 | +Один и тот же символ в разных контекстах может указывать на разные операции, например, `*`, `&`, `-`, `+`. |
| 12 | + |
| 13 | +Выражение может содержать несколько различных операторов. Порядок выполнения операций, задаваемых операторами, зависит от приоритета операторов. Операции, соответствующие операторам с более высоким приоритетом, выполняются первыми. |
| 14 | + |
| 15 | + |
| 16 | +## Таблица приоритетов операторов языка Си |
| 17 | + |
| 18 | +**1 приоритет** |
| 19 | +- `( )` группирующие скобки и вызовы функции |
| 20 | +- `[]` индексация массива |
| 21 | +- `.`, `->` прямой и косвенный доступ к элементу структуры или объединения |
| 22 | +- `++`, `--` постфиксные инкремент и декремент |
| 23 | + |
| 24 | +**2 приоритет** (обратная ассоциативность, справа налево) |
| 25 | +- `+`, `-` унарные плюс и минус `-` |
| 26 | +- `!` логическое отрицание |
| 27 | +- `~` побитовое отрицание |
| 28 | +- `++`, `--` префиксные инкремент и декремент |
| 29 | +- `&` взятие адреса |
| 30 | +- `*` косвенная адресация |
| 31 | +- `(type)` приведение к типу |
| 32 | +- `sizeof` получение размера операнда |
| 33 | + |
| 34 | +**3 приоритет** |
| 35 | +- `*`, `/` и `%` |
| 36 | + |
| 37 | +**4 приоритет** |
| 38 | +- `+`, `-` бинарные сложение и вычитание |
| 39 | + |
| 40 | +**5 приоритет** |
| 41 | +- `<<`, `>>` побитовые сдвиги влево и вправо |
| 42 | + |
| 43 | +**6 приоритет** |
| 44 | +- `<`, `<=`, `>`, `>=` сравнения |
| 45 | + |
| 46 | +**7 приоритет** |
| 47 | +- `==`, `!=` проверка равенства и неравенства |
| 48 | + |
| 49 | +**8 приоритет** |
| 50 | +- `&` побитовое И |
| 51 | + |
| 52 | +**9 приоритет** |
| 53 | +- `^` побитовое Исключающее ИЛИ |
| 54 | + |
| 55 | +**10 приоритет** |
| 56 | +- `|` побитовое ИЛИ |
| 57 | + |
| 58 | +**11 приоритет** |
| 59 | +- `&&` логическое И |
| 60 | + |
| 61 | +**12 приоритет** |
| 62 | +- `||` логическое ИЛИ |
| 63 | + |
| 64 | +**13 приоритет** (обратная ассоциативность, справа налево) |
| 65 | +- `? :` условный оператор |
| 66 | + |
| 67 | +**14 приоритет** (обратная ассоциативность, справа налево) |
| 68 | +- `=`, `+=`, `-=`, `*=`, `\=`, `%=`, `>>=`, `<<=`, `&=`, `^=`, `|=` присвания |
| 69 | + |
| 70 | +**15 приоритет** |
| 71 | +- `,` |
| 72 | + |
| 73 | + |
| 74 | +## Ассоциативность операторов |
| 75 | + |
| 76 | +Если в одном выражении встречаются два оператора с одинаковым приоритетом, то порядо выполнения определяется ассоциативностью. В общем случае, вычисление производятся справа налево (прямая ассоцитивность). |
| 77 | + |
| 78 | +```c |
| 79 | +int x = 10 / 2 * 5; // = 25, т.к. для операторов / и * ассоциативность прямая, |
| 80 | + // вычисляются слева направо. Эквивалентно выражению (10 | 2) * 5 |
| 81 | +``` |
| 82 | + |
| 83 | +Группы операторов, имеющие обратную ассоциативность (вычисляются справа налево) обозначены в таблице выше. |
0 commit comments