Язык программирования C++ поддерживает все операторы своего прародителя Си и дополнен новыми операторами и возможностями. например, операторами приведения типа: const_cast static_cast dynamic_cast reinterpret_cast возможность перегрузки операторов;
После вычисления первого операнда для неперегруженных операторов «&&», «||» и «,» (оператор «запятая», ) компилятор вставляет точку следования (), гарантирующую, что все побочные эффекты (например, оператор «постфиксный ++») будут выполнены до начала вычисления второго операнда.
Языки с Си-подобным синтаксисом (например, Java, C#, PHP и другие) часто заимствуют операторы Cи/C++ с сохранением не только поведения, но также приоритета и ассоциативности.
Таблицы В таблицах используются следующие обозначения: «a», «b» и «c»: имена объектов или значения (литералы, значения переменных, возвращаемые значения, lvalue); «Перегружаемый»: возможность перегрузки оператора в языке C++; «Реализован в Си»: существование оператора в языке Си; «R», «T», «S»: имена типов; «Пример»: пример объявления перегруженного оператора; «Член типа T»: определение оператора в виде метода структуры или класса (внутри структуры или класса); пример: struct T { // или class operator float () const; }; T::operator float () const { /* реализация */ }; «Определение вне класса»: определение оператора в виде функции; пример: #include <iostream> struct T { // или class /* ... */ }; std::ostream & operator << ( std::ostream & a, T const & b ) { /* реализация */ } «Н/Д»: недоступно.
Арифметические операторы Операция (выражение)Оператор Синтаксис выражения Перегружаемый Реализован в Си Пример Член типа T Определение вне класса Присваивание= a = b Сложение+ a + b Вычитание- a - b Унарный плюс+ +a Унарный минус- -a Умножение* a * b Деление/ a / b (остаток от деления целых чисел) %a % b Инкремент префиксный ++ ++a width="8%" width="8 %" суффиксный (постфиксный)++ a++ rowspan="2" rowspan="2" Декремент префиксный -- --a суффиксный (постфиксный)-- a-- rowspan="2" rowspan="2"
Операторы сравнения Операция (выражение) Оператор Синтаксис выражения Перегружаемый Реализован в Си Пример Член типа T Определение вне класса Сравнение== a == b width="8%" width="8 %" Неравенство!= a != b Больше> a > b Меньше< a < b Больше или равно>= a >= b Меньше или равно<= a <= b <=> a <=> b
Логические операторы Операция (выражение)Оператор Синтаксис выражения Перегружаемый Реализован в Си Пример Член типа T Определение вне класса Логическое отрицание, НЕ! !a width="8%" width="8 %" Логическое умножение, И&& a && b Логическое сложение, ИЛИ|| a || b
Побитовые операторы Операция (выражение)Оператор Синтаксис выражения Перегружаемый Реализован в Си Пример Член типа T Определение вне класса Побитовая инверсия~ ~a width="8%" width="8 %" Побитовое И& a & b Побитовое ИЛИ (or)| a | b Побитовое исключающее ИЛИ (xor)^ a ^ b Побитовый сдвиг влево<< a << b Побитовый сдвиг вправо>> a >> b
Составное присваивание Операция (выражение)Оператор Синтаксис выражения Значение Перегружаемый Реализован в Си Пример Член типа 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 Побитовое «И» (AND), совмещённое с присваиванием&= a &= b a = a & b Побитовое «ИЛИ» (or), совмещённое с присваиванием|= a |= b a = a | b Побитовое «исключающее ИЛИ» (xor), совмещённое с присваиванием^= a ^= b a = a ^ b Побитовый сдвиг влево, совмещённый с присваиванием<<= a <<= b a = a << b Побитовый сдвиг вправо, совмещённый с присваиванием>>= a >>= b a = a >> b Операторы работы с указателями и членами класса Оператор Синтаксис Перегружаемый Реализован в Си Пример Член типа 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"
Другие операторы Оператор Синтаксис Перегружаемый Реализован в Си Пример Член типа T Определение вне классаФунктор'' a(a1, a2) width="8%" width="8 %" width="25%" Оператор «запятая» a, b Тернарная условная операция a ? b : c colspan="2" Оператор расширения области видимости a::b colspan="2" Пользовательские литералы (введены в C++11) "a"_b Sizeof (размер) sizeof(a)sizeof(type) colspan="2" Align-of (выравнивание) alignof(type) или _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
Примечания:
Приоритеты операторов В данной таблице указаны приоритеты операторов и их ассоциативность. Операторы, указанные в таблице выше (раньше), имеют более высокий приоритет (приоритет вычисления). При рассмотрении выражения операторы, имеющие более высокий приоритет, будут вычислены раньше операторов с низким приоритетом. Если несколько операторов указаны в одной ячейке, то они имеют одинаковый приоритет и вычисляются в последовательности, задаваемой ассоциативностью. Приоритеты операторов не изменяются при их перегрузке.
Этой таблицы приоритетов в большинстве случаев бывает достаточно, за исключением следующих случаев. Тернарный оператор «?:» может содержать в среднем выражении оператор «запятая» или присваивание, но код «» компилятор воспринимает как «», а не как бессмысленное выражение «». Таким образом, выражение между ? и : воспринимается, как если бы оно было в скобках.
Приоритет Оператор Описание Ассоциативность 1 Наивысший :: Разрешение области видимости Нет 2 ++ Суффиксный инкремент Слева направо -- Суффиксный декремент () Вызов функции [] Взятие элемента массива . Выбор элемента по ссылке -> Выбор элемента по указателю typeid() RTTI (только C++; см typeid) const_cast Приведение типа (C++) (см const cast) dynamic_cast Приведение типа (C++) (см dynamic cast) reinterpret_cast Каламбур типизации (C++) (см reinterpret_cast) static_cast Приведение типа (C++) (см static cast) 3 ++ Префиксный инкремент Справа налево -- Префиксный декремент + Унарный плюс - Унарный минус ! Логическое НЕ ~ Побитовое НЕ (type) Приведение типа * Разыменование указателя & Взятие адреса объекта sizeof Sizeof (размер) new, new[] Выделение динамической памяти (C++) delete, delete[] Освобождение динамической памяти (C++) 4 .* Указатель на член (C++) Слева направо ->* Указатель на член (C++) 5 * Умножение / Деление % Получение остатка от деления 6 + Сложение - Вычитание 7 << Побитовый сдвиг влево >> Побитовый сдвиг вправо 8 < Меньше <= Меньше или равно > Больше >= Больше или равно 9 == Сравнение != Неравенство 10 & Побитовое И (and) 11 ^ Побитовое исключающее ИЛИ (xor) 12 | Побитовое ИЛИ (or) 13 && Логическое И 14 || Логическое ИЛИ 15 ?: Тернарная условная операция Справа налево = Присваивание += Сложение, совмещённое с присваиванием -= Вычитание, совмещённое с присваиванием *= Умножение, совмещённое с присваиванием /= Деление, совмещённое с присваиванием %= Вычисление остатка от деления, совмещённое с присваиванием <<= Побитовый сдвиг влево, совмещённый с присваиванием >>= Побитовый сдвиг вправо, совмещённый с присваиванием &= Побитовое «И», совмещённое с присваиванием |= Побитовое «ИЛИ», совмещённое с присваиванием ^= Побитовое «исключающее ИЛИ» (xor), совмещённое с присваиванием throw Оператор создания исключения (C++) 16 , Оператор «запятая» Слева направо
Описание Компилятор использует таблицу приоритетов для определения порядка вычисления операторов.
Например, ++x*3 был бы двусмысленным без каких-либо правил приоритетов. По таблице можно сказать, что x сначала связывается с оператором ++, и только затем с оператором *, поэтому независимо от действия оператора ++, это действие только над x (а не над x*3). Таким образом, выражение эквивалентно (++x, x*3). Аналогично с кодом 3*x++, где таблица утверждает, что инкремент применяется только к x а не к 3*x. Функционально это выражение эквивалентно (tmp=x, x++, tmp=3*tmp, tmp), если выразить временную переменную как tmp.
Связывание операторов в стандартах Си и C++ определено через грамматику языка, а не через таблицу. Это может создать конфликт. Например, в языке Си синтаксис условного оператора таков: logical-OR-expression ? expression : conditional-expression А в языке C++: logical-OR-expression ? expression : assignment-expression
Из-за этого выражение: e = a < d ? a++ : a = d будет воспринято по-разному в этих двух языках. В Си выражение синтаксически некорректно, так как результат условного оператора не может служить lvalue (то есть, левой частью оператора присваивания).
В C++, выражение будет разобрано как корректное: e = (a < d ? a++ : (a = d))
Приоритеты побитовых логических операторов несколько неинтуитивны. Концептуально & и | являются такими же арифметическими операторами как * и + соответственно.
Выражение синтаксически воспринимается как , но выражение эквивалентно . Из-за этого часто требуется пользоваться скобками для явного задания порядка вычислений.
Синонимы операторов в C++ В стандарте C++ определены диграфы для некоторых операторов:
Диграф Эквивалентная строка and && bitand & and_eq &= or || bitor | or_eq |= xor ^ xor_eq ^= not ! not_eq != compl ~
Диграфы могут использоваться точно так же как и операторы, являются синонимами операторов. Например, диграф «» может использоваться для замены операторов «побитовое И» и «получение адреса» или в определении ссылочных типов. Так, код «» эквивалентен коду «».
Стандарт ANSI/ISO C определяет перечисленные диграфы в виде констант (см. препроцессор). Константы определены в заголовочном файле «iso646.h». Для совместимости с Си стандарт C++ определяет фиктивный заголовочный файл «ciso646».
Примечания
Ссылки Статья «Операторы C++» на сайте cppreference.com. Статья «Префиксные и постфиксные операторы в языках Си и C++» на сайте msdn.microsoft.com. ISO/IEC 14882
Категория:Си (язык программирования) Категория:Синтаксис C++ Категория:Операции в программировании