← Все вопросы

Операторы C++ — есть нормальная таблица с приоритетами? Путаюсь в порядке вычислений

Задан 21 месяц назад428 просмотров2 ответа
7

Готовлюсь к олимпиаде, и постоянно спотыкаюсь на выражениях вроде такого:

int x = 2 + 3 * 4;       // тут понятно, 14
bool b = 1 < 2 && 3 > 4; // а тут уже не уверен
int y = 5 & 3 == 3;      // и вот это вообще выдаёт не то, что жду

Последняя строка особенно бесит — думал получу 1, а получаю что-то странное. Нужна таблица операторов c++ с приоритетами и понимание, что когда считается раньше.

2 ответа

12
✓ Принятый ответ — помог автору

Твоя последняя строка — классическая ловушка. == имеет более высокий приоритет, чем &, поэтому 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

Главный совет: не пытайся запоминать всю таблицу. Запомни топ-частые (* / % выше + -, сравнения выше логики, всё выше присваивания), а в спорных местах ставь скобки — читаемость важнее экономии символов.

5

Ещё про два логических оператора && и || важно знать про короткое замыкание (short-circuit):

if (p != nullptr && p->value > 0) { ... }

Если p == nullptr, то правая часть p->value даже не вычисляется — иначе был бы краш. Это не просто приоритет, это порядок вычисления слева направо с обрывом. Часто спасает.

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект