Операторы C++ — есть нормальная таблица с приоритетами? Путаюсь в порядке вычислений
Готовлюсь к олимпиаде, и постоянно спотыкаюсь на выражениях вроде такого:
int x = 2 + 3 * 4; // тут понятно, 14
bool b = 1 < 2 && 3 > 4; // а тут уже не уверен
int y = 5 & 3 == 3; // и вот это вообще выдаёт не то, что жду
Последняя строка особенно бесит — думал получу 1, а получаю что-то странное. Нужна таблица операторов c++ с приоритетами и понимание, что когда считается раньше.
2 ответа
Твоя последняя строка — классическая ловушка. == имеет более высокий приоритет, чем &, поэтому 5 & 3 == 3 это на самом деле 5 & (3 == 3) = 5 & 1 = 1... стоп, а вот тут как раз 1. Но смысл точно не тот, что ты задумывал. Всегда ставь скобки вокруг битовых операций.
Вот сокращённая таблица операторов по убыванию приоритета (сверху — выше):
| Приоритет | Операторы | Что делают |
|---|---|---|
| 1 | () [] . -> |
вызов, индекс, доступ |
| 2 | ! ~ ++ -- -(унарный) |
унарные |
| 3 | * / % |
умножение, деление, остаток |
| 4 | + - |
сложение, вычитание |
| 5 | << >> |
сдвиги |
| 6 | < <= > >= |
сравнение |
| 7 | == != |
равенство |
| 8 | & |
битовое И |
| 9 | ^ |
битовое XOR |
| 10 | | |
битовое ИЛИ |
| 11 | && |
логическое И |
| 12 | || |
логическое ИЛИ |
| 13 | ?: |
тернарный |
| 14 | = += -= ... |
присваивание |
Разбор твоих примеров:
int x = 2 + 3 * 4; // * раньше + -> 2 + 12 = 14
bool b = 1 < 2 && 3 > 4; // сравнения раньше && -> (1<2)&&(3>4) -> true&&false -> false
int y = 5 & 3 == 3; // == раньше & -> 5 & (3==3) -> 5 & 1 -> 1
Главный совет: не пытайся запоминать всю таблицу. Запомни топ-частые (* / % выше + -, сравнения выше логики, всё выше присваивания), а в спорных местах ставь скобки — читаемость важнее экономии символов.
Ещё про два логических оператора && и || важно знать про короткое замыкание (short-circuit):
if (p != nullptr && p->value > 0) { ... }
Если p == nullptr, то правая часть p->value даже не вычисляется — иначе был бы краш. Это не просто приоритет, это порядок вычисления слева направо с обрывом. Часто спасает.