Тут наведено перелік операторів, що використовуються у мовах програмування C й C++. Усі наведені оператори присутні у C++. Якщо оператор також використовується у мові С, це буде відмічено у стовпчику "Присутній у С". Стовпчик "Можливість перевантаження" має сенс лише для мови C++, оскільки C не підтримує перевантаження операторів.

За відсутності перевантаження, для операторів &&, ||, та , (оператор кома), існує точка перебігу після обчислення першого операнду.

C++ також містить наступні оператори приведення типів const_cast, static_cast, dynamic_cast, та reinterpret_cast, які в таблиці не подані задля скорочення. Форматування цих операторів означає, що рівень їх пріоритету не є важливим.

Більшість операторів C та C++ також використовуються у мовах C#, Java, Perl, та PHP з тими самими пріоритетом, асоціативністю та семантикою.

Таблиця В даній таблиці символи a, b, та c - це будь-які значення (літерали, значення змінних, або повернені значення), імена об'єктів або інші значення, що мають адресу.

"Можливість перевантаження" означає, що даний оператор може бути перевантажений засобами C++, але не у мові С, оскільки вона не підтримує перевантаження операторів."Присутній у C" означає що даний оператор існує і має семантичний зміст у мові C.

Арифметичні оператори Ім'я оператора Синтаксис Можливість перевантаження Присутній у C Приклади прототипів (T будь-якого типу) Як член класу T Поза описом класу Присвоєння a = b Додавання a + b Віднімання a - b Унарний плюс (integer promotion) +a Унарний мінус (additive inverse) -a Множення a * b Ділення a / b Остача від ділення a % b Інкремент у вигляді префіксу ++a width="8%" width="8%" у вигляді суфіксу a++ rowspan="2" rowspan="2" Примітка: C++ використовує фіктивний параметр для вирізнення префіксного та суфіксного операторів інкременту. Декремент у вигляді префіксу --a у вигляді суфіксу a-- rowspan="2" rowspan="2" Примітка: C++ використовує фіктивний параметр для вирізнення префіксного та суфіксного операторів декременту.

Оператори порівняння/відношення    Оператор name   Синтаксис Можливість перевантаження Присутній уC Приклади прототипів (T будь-якого типу) Як член класу T Поза описом класу Дорівнює a == b width="8%" width="8%" Не дорівнює a != b Більше a > b Менше a < b Більше або дорівнює a >= b Менше або дорівнює a <= b

Логічні оператори Ім'я оператора   Синтаксис Можливість перевантаження Присутній уC Приклади прототипів (T будь-якого типу) Як член класу T Поза описом класу Логічне заперечення (НЕ) !a width="8%" width="8%" Логічне І a && b Логічне АБО a || b

Побітові оператори Ім'я оператора   Синтаксис Можливість перевантаження Присутній уC Приклади прототипів (T будь-якого типу) Як член класу T Поза описом класу Побітове НЕ ~a width="8%" width="8%" Побітове І a & b Побітове АБО a | b Побітове виключаюче АБО a ^ b Побітовий зсув вліво a << b Побітовий зсув вправо a >> b

Складені оператори присвоєння Ім'я оператора  Синтаксис   Сенс Можливість перевантаження Присутній уC Приклади прототипів (T будь-якого типу) Як член класу T Поза описом класу Додавання з присвоєнням a += b a = a + b width="8%" width="8%" Віднімання з присвоєнням a -= b a = a - b Множення з присвоєнням a *= b a = a * b Ділення з присвоєнням a /= b a = a / b Отримання остачі з присвоєнням a %= b a = a % b Побітове І з присвоєнням a &= b a = a & b Побітове АБО з присвоєнням a |= b a = a | b Побітове виключаюче АБО з присвоєнням a ^= b a = a ^ b Побітовий зсув вліво з присвоєнням a <<= b a = a << b Побітовий зсув вправо з присвоєнням a >>= b a = a >> b

Операції із вказівниками та членами Ім'я оператора Синтаксис Можливість перевантаження Присутній уC Приклади прототипів (T, T2 та R будь-якого типу) Як член класу T Поза описом класу Індексація масиву a[b] width="8%" width="8%" width="25%" Розіменування покажчика ("на об'єкт вказує a") *a Вказівник ("отримання адреси змінної a") &a Розкриття посилання на структуру ("на член b об'єкта вказує a") a->b Посилання на структуру ("член b об'єкта a") a.b colspan="2" На член вказує b що належить об'єкту на який вказує a a->*b На член вказує b що належить об'єкту a a.*b colspan="2"

Інші оператори Ім'я оператора Синтаксис Можливість перевантаження Присутній уC Приклади прототипів (T, R, Arg1 та Arg2 будь-якого типу) Як член класу T Поза описом класу Виклик Функції Дивись Функтор. a(a1, a2) width="8%" width="8%" width="25%" Кома a, b Тернарний умовний оператор a ? b : c colspan="2" Розширення області дії a::b colspan="2" Отримання розміру sizeof(a)sizeof(type) colspan="2" Отримання вирівнювання alignof(type) or _Alignof(type) colspan="2" Ідентифікація типу typeid(a)typeid(type) colspan="2" Приведення типу (type) a rowspan="2" rowspan="2" Примітка: для перетворень, які є визначені користувачем, тип що повертається повинен обов'язково збігатися з ім'ям оператора. Виділення пам'яті new type Виділення пам'яті під масив new type[n] Вивільнення пам'яті delete a Вивільнення пам'яті масиву delete[] a

Примітки:

Пріоритет операторів У наступній таблиці вказано пріоритет та асоціативність усіх операторів мов C та C++ (якщо будь-який з вказаних операторів існує в мовах Java, Perl, PHP або інший сучасних мовах, його пріоритет, скоріш за все, буде таким самим). Оператори вказані в порядку зниження пріоритету зверху вниз. Зниження пріоритету відноситься до пріоритету обчислень. В процесі обчислення виразу, оператор вказаний у певному рядку таблиці, буде обчислений раніше за оператор, вказаний у будь-якому нижчому за нього рядку. Оператори, вказані в одній комірці, обчислюються з однаковим пріоритетом в порядку їх запису у виразі. При перевантаженні, пріоритет оператора не змінюється.

Синтакс виразів у мовах C та C++ визначається контекстно-вільною граматикою. Наведена вище таблиця отримана на основі граматики.

Слід зазначити, що в деяких випадках таблиця пріоритетів на працює. Наприклад, тернарний умовний оператор дозволяє використовувати як свій середній операнд будь-який довільний вираз, попри те, що за таблицею його пріоритет вищий, ніж у операторів присвоєння та коми. Таким чином вираз a ? b , c : d інтерпретується саме як a ? (b, c) : d, а не (a ? b), (c : d) (що не мало б сенсу). Крім того, слід зазначити, що безпосередній результат виразу, який перетворює типи, не може бути операндом sizeof. Тому, sizeof (int) * x інтерпретується як (sizeof(int)) * x, а не sizeof ((int) *x).

Пріоритет Оператор Опис Асоціативність 1 найвищий :: Розширення області дії (тільки для C++) Зліва направо 2 ++ Інкремент у вигляді суфікса -- Декремент у вигляді суфікса () Виклик функції [] Індексація масиву . Вибір елементу через посилання -> Вибір елементу через покажчик typeid() Визначення типу в процесі виконання програми (тільки у С++) const_cast Перетворення типів (тільки у C++) dynamic_cast Перетворення типів (тільки у C++) reinterpret_cast Перетворення типів (тільки у C++) static_cast Перетворення типів (тільки у C++) 3 ++ Інкремент у вигляді префіксу Справа наліво -- Декремент у вигляді префіксу + Унарний плюс - Унарний мінус ! Логічне НЕ ~ Побітове НЕ (type) Перетворення типів * Розіменування & Отримання адреси sizeof Отримання розміру new, new[] Динамічне виділення пам'яті (тільки у C++) delete, delete[] Динамічне вивільнення пам'яті (тільки у C++) 4 .* Вказівник на член (тільки у C++) Зліва направо ->* Вказівник на член (тільки у C++) 5 * Множення / Ділення % Отримання остачі від ділення 6 + Додавання - Віднімання 7 << Побітовий зсув вліво >> Побітовий зсув вправо 8 < Менше <= Менше або дорівнює > Більше >= Більше або дорівнює 9 == Дорівнює != Не дорівнює 10 & Побітове І 11 ^ Побітове виключне АБО 12 | Побітове АБО 13 && Логічне І 14 || Логічне АБО 15 ?: Тернарний умовний оператор Справа наліво 16 = Пряме присвоєння += Присвоєння суми -= Присвоєння різниці *= Присвоєння добутку /= Присвоєння частки %= Присвоєння остачі <<= Присвоєння побітового зсуву вліво >>= Присвоєння побітового зсуву вправо &= Присвоєння побітового І ^= Присвоєння побітового виключного АБО |= Присвоєння побітового АБО 17 throw Створення тестової помилки (винятку) (тільки у C++) 18 , Кома Зліва направо

Примітки

Таблиця пріоритету визначає порядок застосування (поєднання) операторів у складних виразах, коли цей порядок не заданий явно за допомогою круглих дужок.

Наприклад, вираз ++x*3 без застосування правил пріоритету має певну двозначність. Таблиця пріоритету каже нам, що: x тісніше 'пов'язаний' з ++, ніж з *, тому, щоб не робив оператор ++ (зараз чи пізніше), він робитиме це ТІЛЬКИ з x (а не з x*3); це еквівалентно виразу (++x, x*3). Аналогічним чином, для виразу 3*x++, де постфіксний оператор інкременту ++ хоча і призначений діяти ПІСЛЯ обчислення усього виразу, але таблиця пріоритетів ясно вказує, що не зважаючи на це, інкрементується ТІЛЬКИ x (а не 3*x); це еквівалентно виразу подібному до (tmp=3*x, ++x, tmp), де tmp є тимчасовим значенням.

Зобразимо проблему пріоритету операторів та їх поєднання у вигляді діаграми. Завданням компілятора є перетворення цієї діаграми у вираз, в якому декілька унарних операторів ( назвемо їх 3+( . ), 2*( . ), ( . )++ та ( . )[ i ] ) конфліктують за поєднання з y. Проблема вирішується за допомогою таблиці пріоритету, яка дозволяє сформувати остаточний набір виразів: ( . )[ i ] діє тільки на y, ( . )++ діє тільки на y[i], 2*( . ) діє тільки на y[i]++ та 3+( . ) діє 'тільки' на 2*((y[i])++). Важливо зазначити, що таблиця дозволяє визначити, який з виразів буде використаний кожним з операторів, але відповіді на питання "КОЛИ кожний оператор вступить в дію", таблиця не дає. В даному прикладі оператор ( . )++ діє тільки на y[i] за правилами таблиці, але самі по собі рівні поєднання не визначають час виконання суфікса ++ (оператор ( . )++ буде використаний лише після обчислення у виразі елементу y[i]).

Низка багатосимвольних операторів отримують власні "імена", побудовані з назв операторів для кожного свого символу. Наприклад, оператори += та -= часто називаються плюс дорівнює та мінус дорівнює, а не "присвоєння суми" та "присвоєння різниці", що було б громіздкіше.

Поєднання операторів у C та C++ визначається скоріше граматикою мови (викладеною у відповідних стандартах), а не таблицею пріоритету. Це створює деякі приховані конфлікти. Наприклад, у мові С, синтаксис для виразу з умовним переходом є таким: logical-OR-expression ? expression : conditional-expression в той час коли у C++ він такий: logical-OR-expression ? expression : assignment-expression Таким чином вираз: e = a < d ? a++ : a = d у двох мовах граматично розбивається по різному. У мові C цей вираз є синтаксичною помилкою, але багато компіляторів розбивають вираз так: e = ((a < d ? a++ : a) = d) що є семантичною помилкою, оскільки результат виразу з умовним переходом (яким може бути a++) не є адресованим значенням (lvalue). У C++ це розбивається як: e = (a < d ? a++ : (a = d)) що є правильним виразом.

Пріоритет побітових операторів було розкритиковано . Концептуально, оператори & and | є арифметичними операторами, подібними до + and *.

Вираз синтаксично розбивається як , коли вираз розбивається як . Це потребує частішого застосування круглих дужок.

Синоніми операторів C++ C++ визначає набір ключових слів, які можуть діяти як псевдоніми деяких операторів: and (&&), bitand (&), and_eq (&=), or (||), bitor (|), or_eq (|=), xor (^), xor_eq (^=), not (!), not_eq (!=), compl (~). Їх можна використовувати тим самим чином як і ті символи, які вони замінюють, оскільки псевдонім це не тільки той самий оператор, але під іншим ім'ям, але скоріше це є текстовий еквівалент імені відповідного оператора. Наприклад, bitand можна використати для заміни не тільки побітового оператора але і оператора отримання адреси і навіть використати для вказання типів посилань (наприклад: int bitand ref = n; замість int &ref = n; ).