Операторы в C и C++
Это список операторов языков C и C++ программирования . Все перечисленные операторы (кроме typeof ) существуют в C++; столбец «Включено в C» указывает, присутствует ли оператор также в C. Обратите внимание, что C не поддерживает перегрузку операторов .
Когда не перегружено, для операторов &&
, ||
, и ,
( оператор-запятая имеется точка последовательности ), после вычисления первого операнда .
C++ также содержит преобразования типов. операторы const_cast
, static_cast
, dynamic_cast
, и reinterpret_cast
. Форматирование этих операторов означает, что их уровень приоритета неважен.
Большинство операторов, доступных в C и C++, также доступны в других языках семейства C, таких как C# , D , Java , Perl и PHP , с тем же приоритетом, ассоциативностью и семантикой.
Стол
[ редактировать ]Для целей этих таблиц a
, b
, и c
представляют допустимые значения (литералы, значения переменных или возвращаемое значение), имена объектов или lvalue, в зависимости от ситуации. R
, S
и T
обозначают любой тип(ы) и K
для типа класса или перечислимого типа. Некоторые операторы имеют альтернативное написание с использованием диграфов и триграфов или синонимов операторов .
Арифметические операторы
[ редактировать ]Все арифметические операторы существуют в C и C++ и могут быть перегружены в C++.
Имя оператора | Синтаксис | Примеры прототипов C++ | ||
---|---|---|---|---|
Будучи членом К. | Определения внешних классов | |||
Добавление | a + b
|
R K::operator +(S b);
|
R operator +(K a, S b);
| |
Вычитание | a - b
|
R K::operator -(S b);
|
R operator -(K a, S b);
| |
Унарный плюс ( целочисленное продвижение ) | +a
|
R K::operator +();
|
R operator +(K a);
| |
Унарный минус ( аддитивный обратный ) | -a
|
R K::operator -();
|
R operator -(K a);
| |
Умножение | a * b
|
R K::operator *(S b);
|
R operator *(K a, S b);
| |
Разделение | a / b
|
R K::operator /(S b);
|
R operator /(K a, S b);
| |
По модулю (целый остаток) [а] | a % b
|
R K::operator %(S b);
|
R operator %(K a, S b);
| |
Приращение | Префикс | ++a
|
R& K::operator ++();
|
R& operator ++(K& a);
|
Постфикс | a++
|
R K::operator ++(int);
|
R operator ++(K& a, int);
| |
Примечание. C++ использует безымянный параметр-dummy. int различать префиксные и постфиксные операторы приращения.
| ||||
Декремент | Префикс | --a
|
R& K::operator --();
|
R& operator --(K& a);
|
Постфикс | a--
|
R K::operator --(int);
|
R operator --(K& a, int);
| |
Примечание. C++ использует безымянный параметр-dummy. int различать префиксные и постфиксные операторы декремента.
|
Операторы сравнения/операторы отношений
[ редактировать ]Все операторы сравнения могут быть перегружены в C++. Начиная с C++20 , оператор неравенства генерируется автоматически, если operator==
определен, и все четыре оператора отношения генерируются автоматически, если operator<=>
определяется. [1]
Имя оператора | Синтаксис | Включено в С |
Примеры прототипов | ||
---|---|---|---|---|---|
Будучи членом К. | Определения внешних классов | ||||
Равно | a == b
|
Да | bool K::operator ==(S const& b) const;
|
bool operator ==(K const& a, S const& b);
| |
Не равно | a != b |
Да | bool K::operator !=(S const& b) const;
|
bool operator !=(K const& a, S const& b);
| |
Больше, чем | a > b |
Да | bool K::operator >(S const& b) const;
|
bool operator >(K const& a, S const& b);
| |
Меньше, чем | a < b |
Да | bool K::operator <(S const& b) const;
|
bool operator <(K const& a, S const& b);
| |
Больше или равно | a >= b |
Да | bool K::operator >=(S const& b) const;
|
bool operator >=(K const& a, S const& b);
| |
Меньше или равно | a <= b |
Да | bool K::operator <=(S const& b) const;
|
bool operator <=(K const& a, S const& b);
| |
Трехстороннее сравнение [б] | a <=> b |
Нет | auto K::operator <=>(const S &b);
|
auto operator <=>(const K &a, const S &b);
| |
Оператор имеет в общей сложности 3 возможных типа возврата: std::weak_ordering , std::strong_ordering и std::partial_ordering к которому они все конвертируются.
|
Логические операторы
[ редактировать ]Все логические операторы существуют в C и C++ и могут быть перегружены в C++, хотя перегрузка логического И и логического ИЛИ не рекомендуется, поскольку в качестве перегруженных операторов они ведут себя как обычные вызовы функций, а это означает, что оба оцениваются их операнда, поэтому они теряют свое хорошо используемое и ожидаемое свойство оценки короткого замыкания . [2]
Имя оператора | Синтаксис | Примеры прототипов C++ | ||
---|---|---|---|---|
Будучи членом К. | Определения внешних классов | |||
Логическое отрицание (НЕ) | !a
|
bool K::operator !();
|
bool operator !(K a);
| |
Логическое И | a && b
|
bool K::operator &&(S b);
|
bool operator &&(K a, S b);
| |
Логическое ИЛИ | a || b
|
bool K::operator ||(S b);
|
bool operator ||(K a, S b);
|
Побитовые операторы
[ редактировать ]Все побитовые операторы существуют в C и C++ и могут быть перегружены в C++.
Имя оператора | Синтаксис | Примеры прототипов | ||
---|---|---|---|---|
Будучи членом К. | Определения внешних классов | |||
Побитовое НЕ | ~a |
R K::operator ~();
|
R operator ~(K a);
| |
Побитовое И | a & b
|
R K::operator &(S b);
|
R operator &(K a, S b);
| |
Побитовое ИЛИ | a | b
|
R K::operator |(S b);
|
R operator |(K a, S b);
| |
Побитовое исключающее ИЛИ | a ^ b
|
R K::operator ^(S b);
|
R operator ^(K a, S b);
| |
Побитовый сдвиг влево [с] | a << b
|
R K::operator <<(S b);
|
R operator <<(K a, S b);
| |
Побитовый сдвиг вправо [с] [д] | a >> b
|
R K::operator >>(S b);
|
R operator >>(K a, S b);
|
Операторы присваивания
[ редактировать ]Все выражения присваивания существуют в C и C++ и могут быть перегружены в C++.
Для данных операторов семантика встроенного выражения комбинированного присваивания a ⊚= b
эквивалентно a = a ⊚ b
, за исключением того, что a
оценивается только один раз.
Имя оператора | Синтаксис | Примеры прототипов C++ | |
---|---|---|---|
Будучи членом К. | Определения внешних классов | ||
Прямое назначение | a = b
|
R& K::operator =(S b);
|
— |
Дополнительное задание | a += b
|
R& K::operator +=(S b);
|
R& operator +=(K& a, S b);
|
Назначение вычитания | a -= b
|
R& K::operator -=(S b);
|
R& operator -=(K& a, S b);
|
Назначение умножения | a *= b
|
R& K::operator *=(S b);
|
R& operator *=(K& a, S b);
|
Назначение дивизии | a /= b
|
R& K::operator /=(S b);
|
R& operator /=(K& a, S b);
|
Назначение по модулю | a %= b
|
R& K::operator %=(S b);
|
R& operator %=(K& a, S b);
|
Побитовое И присваивание | a &= b
|
R& K::operator &=(S b);
|
R& operator &=(K& a, S b);
|
Побитовое ИЛИ присваивание | a |= b
|
R& K::operator |=(S b);
|
R& operator |=(K& a, S b);
|
Побитовое назначение XOR | a ^= b
|
R& K::operator ^=(S b);
|
R& operator ^=(K& a, S b);
|
Побитовое назначение сдвига влево | a <<= b
|
R& K::operator <<=(S b);
|
R& operator <<=(K& a, S b);
|
Побитовое назначение сдвига вправо [д] | a >>= b
|
R& K::operator >>=(S b);
|
R& operator >>=(K& a, S b);
|
Операторы-члены и указатели
[ редактировать ]Имя оператора | Синтаксис | Возможна перегрузка в C++ | Включено в С |
Примеры прототипов C++ | ||
---|---|---|---|---|---|---|
Будучи членом К. | Определения внешних классов | |||||
Индекс | a[b]
|
Да | Да | R& K::operator [](S b); R& K::operator [](S b, ...); // since C++23 |
— | |
Косвенность («объект, на который указывает « ) | *a |
Да | Да | R& K::operator *();
|
R& operator *(K a);
| |
Адрес-оф («адрес » ) | &a |
Да [и] | Да | R* K::operator &();
|
R* operator &(K a);
| |
Разыменование структуры («член b объекта, на который указывает a ») | a->b |
Да | Да | R* K::operator ->(); [ф] |
— | |
Ссылка на структуру («член b объекта a ») | a.b |
Нет | Да | — | ||
Член, выбранный указателем на элемент b объекта, на который указывает a [г] | a->*b |
Да | Нет | R& K::operator ->*(S b);
|
R& operator ->*(K a, S b);
| |
Член объекта a, выбранный указателем на элемент b | a.*b |
Нет | Нет | — |
Другие операторы
[ редактировать ]Имя оператора | Синтаксис | Возможна перегрузка в C++ | Включено в С |
Примеры прототипов | ||
---|---|---|---|---|---|---|
Будучи членом К. | Определения внешних классов | |||||
функции Вызов См. Объект функции . |
a(a1, a2)
|
Да | Да | R K::operator ()(S a, T b, ...);
|
— | |
Запятая | a, b |
Да | Да | R K::operator ,(S b);
|
R operator ,(K a, S b);
| |
Тернарный условный | a ? b : c |
Нет | Да | — | ||
Разрешение области | a::b [час] |
Нет | Нет | — | ||
Пользовательские литералы [я] начиная с С++11 |
"a"_b |
Да | Нет | — | R operator "" _b(T a)
| |
Размер | sizeof a [Дж] sizeof (R) |
Нет | Да | — | ||
Размер пакета параметров начиная с С++11 |
sizeof...(Args) |
Нет | Нет | — | ||
Алиноф начиная с С++11 |
alignof(R) или _Alignof(R) [к] |
Нет | Да | — | ||
Деклтип начиная с С++11 |
decltype (a) decltype (R) |
Нет | Нет | — | ||
Идентификация типа | typeid(a) typeid(R) |
Нет | Нет | — | ||
Конверсия (состав в стиле C) | (R)a |
Да | Да | K::operator R(); [4]
|
— | |
Конверсия | R(a) R{a} начиная с С++11 auto(a) начиная с С++23 auto{a} начиная с С++23 |
Нет | Нет | Примечание: ведет себя как const_cast/static_cast/reinterpret_cast. В последних двух случаях auto спецификатор заменяется типом изобретенной переменной x, объявленной с помощью auto x(a); (который никогда не интерпретируется как объявление функции) или auto x{a}; , соответственно. [5]
| ||
static_cast преобразование | static_cast<R>(a) |
Да | Нет | K::operator R(); explicit K::operator R(); начиная с С++11
|
— | |
Примечание. Для пользовательских преобразований тип возвращаемого значения неявно и обязательно соответствует имени оператора, если только тип не выведен (например, operator auto() , operator decltype(auto)() и т. д.).
| ||||||
динамическое преобразование актеров | dynamic_cast<R>(a) |
Нет | Нет | — | ||
const_cast преобразование | const_cast<R>(a) |
Нет | Нет | — | ||
reinterpret_cast преобразование | reinterpret_cast<R>(a) |
Нет | Нет | — | ||
Выделить хранилище | new R [л] |
Да | Нет | void* K::operator new(size_t x);
|
void* operator new(size_t x);
| |
Выделить хранилище (массив) | new R[n] [м] |
Да | Нет | void* K::operator new[](size_t a);
|
void* operator new[](size_t a);
| |
Освободить хранилище | delete a |
Да | Нет | void K::operator delete(void* a);
|
void operator delete(void* a);
| |
Освободить хранилище (массив) | delete[] a |
Да | Нет | void K::operator delete[](void* a);
|
void operator delete[](void* a);
| |
Проверка исключений начиная с С++11 |
noexcept(a) |
Нет | Нет | — |
Примечания:
- ^ Оператор модуля работает только с целочисленными операндами, для чисел с плавающей запятой вместо этого необходимо использовать библиотечную функцию (например,
fmod
). - ^ О трехстороннем сравнении C++20
- ^ Jump up to: а б В контексте iostreams в C++ авторы часто ссылаются на
<<
и>>
как операторы «помещение» или «вставка в поток» и «получение из» или «извлечение потока» соответственно. - ^ Jump up to: а б Согласно стандарту C99 сдвиг вправо отрицательного числа определяется реализацией. Большинство реализаций, например GCC, [3] используйте арифметический сдвиг (т. е. расширение знака), но логический сдвиг . возможен и
- ^ Фактический адрес объекта с перегруженным
operator &
можно получить сstd::addressof
- ^ Тип возвращаемого значения
operator->()
должен быть типом, для которого->
можно применить операцию, например тип указателя. Еслиx
имеет типC
гдеC
перегрузкиoperator->()
,x->y
расширяется доx.operator->()->y
. - ^ Мейерс, Скотт (октябрь 1999 г.), «Реализация оператора->* для интеллектуальных указателей» (PDF) , Журнал доктора Добба , Aristeia .
- ^ Хотя
::
Знак пунктуации существует в C, начиная с C23, он не используется в качестве оператора разрешения области. - ^ О определяемых пользователем литералах C++11
- ^ Круглые скобки не нужны при определении размера значения, а только при определении размера типа. Однако обычно их используют независимо. [ нужна ссылка ]
- ^ C++ определяет
alignof
оператор, тогда как C определяет_Alignof
(C23 определяет оба). Оба оператора имеют одинаковую семантику. - ^ Имя типа также можно вывести (например,
new auto
), если указан инициализатор. - ^ Размер массива также можно определить, если указан инициализатор.
Приоритет оператора
[ редактировать ]Ниже представлена таблица, в которой перечислены приоритет и ассоциативность всех операторов языков C и C++ . Операторы перечислены сверху вниз в порядке убывания приоритета. Нисходящий приоритет относится к приоритету группировки операторов и операндов. Что касается выражения, оператор, указанный в некоторой строке, будет сгруппирован перед любым оператором, указанным в строке ниже него. Операторы, находящиеся в одной ячейке (в ячейке может быть несколько строк операторов), группируются с одинаковым приоритетом в заданном направлении. Приоритет оператора не зависит от перегрузки.
Синтаксис выражений в C и C++ определяется грамматикой фразовой структуры . [6] Приведенная здесь таблица была выведена из грамматики. [ нужна ссылка ] Для стандарта ISO C 1999 в разделе 6.5.6, примечание 71 говорится, что грамматика C, предусмотренная спецификацией, определяет приоритет операторов C, а также утверждается, что приоритет операторов, вытекающий из грамматики, точно соответствует порядку разделов спецификации:
« Синтаксис [C] [т.е. грамматика] определяет приоритет операторов при вычислении выражения, который совпадает с порядком основных подпунктов этого подпункта, сначала высший приоритет». [7]
Таблица приоритетов, хотя в основном и адекватна, не может решить некоторые детали. В частности, обратите внимание, что тернарный оператор допускает любое произвольное выражение в качестве своего среднего операнда, несмотря на то, что он указан как имеющий более высокий приоритет, чем операторы присваивания и запятая. Таким образом a ? b, c : d
интерпретируется как a ? (b, c) : d
, а не как бессмысленное (a ? b), (c : d)
. Итак, выражение в середине условного оператора (между ?
и :
) анализируется, как если бы он был заключен в круглые скобки. Также обратите внимание, что непосредственный результат выражения приведения C без скобок не может быть операндом sizeof
. Поэтому, sizeof (int) * x
интерпретируется как (sizeof(int)) * x
и не sizeof ((int) * x)
.
Приоритет | Оператор | Описание | Ассоциативность |
---|---|---|---|
1
самый высокий |
::
|
Разрешение области (только C++) | Никто |
2 | ++
|
Постфиксное приращение | Слева направо |
--
|
Постфиксный декремент | ||
()
|
Вызов функции | ||
[]
|
Подписка на массив | ||
.
|
Выбор элемента по ссылке | ||
->
|
Выбор элемента с помощью указателя | ||
typeid()
|
Информация о типе времени выполнения (только C++) (см. typeid ) | ||
const_cast
|
Приведение типов (только C++) (см. const_cast ) | ||
dynamic_cast
|
Приведение типов (только C++) (см. динамическое приведение ) | ||
reinterpret_cast
|
Приведение типов (только C++) (см. reinterpret_cast ) | ||
static_cast
|
Приведение типов (только C++) (см. static_cast ) | ||
3 | ++
|
Приращение префикса | Справа налево |
--
|
Декремент префикса | ||
+
|
Унарный плюс | ||
-
|
Унарный минус | ||
!
|
Логическое НЕ | ||
~
|
Побитовое НЕ ( дополнение до единиц ) | ||
(type)
|
Тип актерского состава | ||
*
|
Косвенность (разыменование) | ||
&
|
Адрес-из | ||
sizeof
|
Размер | ||
_Alignof
|
Требование выравнивания (начиная с C11) | ||
new , new[]
|
Динамическое распределение памяти (только C++) | ||
delete , delete[]
|
Динамическое освобождение памяти (только C++) | ||
4 | .*
|
Указатель на член (только C++) | Слева направо |
->*
|
Указатель на член (только C++) | ||
5 | *
|
Умножение | Слева направо |
/
|
Разделение | ||
%
|
По модулю (остаток) | ||
6 | +
|
Добавление | Слева направо |
-
|
Вычитание | ||
7 | <<
|
Побитовый сдвиг влево | Слева направо |
>>
|
Побитовый сдвиг вправо | ||
8 | <=>
|
Трехстороннее сравнение (введено в C++20 — только C++) | Слева направо |
9 | <
|
Меньше, чем | Слева направо |
<=
|
Меньше или равно | ||
>
|
Больше, чем | ||
>=
|
Больше или равно | ||
10 | ==
|
Равно | Слева направо |
!=
|
Не равно | ||
11 | &
|
Побитовое И | Слева направо |
12 | ^
|
Побитовое исключающее ИЛИ (исключающее или) | Слева направо |
13 | |
|
Побитовое ИЛИ (включающее или) | Слева направо |
14 | &&
|
Логическое И | Слева направо |
15 | ||
|
Логическое ИЛИ | Слева направо |
16 | co_await
|
Обработка сопрограммы (только C++) | Справа налево |
co_yield
| |||
17 | ?:
|
Тернарный условный оператор | Справа налево |
=
|
Прямое назначение | ||
+=
|
Назначение по сумме | ||
-=
|
Назначение по разнице | ||
*=
|
Назначение по продукту | ||
/=
|
Присваивание по частному | ||
%=
|
Назначение по остатку | ||
<<=
|
Присваивание побитовым сдвигом влево | ||
>>=
|
Присваивание побитовым сдвигом вправо | ||
&=
|
Присваивание побитовым И | ||
^=
|
Присваивание побитовым XOR | ||
|=
|
Присваивание побитовым ИЛИ | ||
throw
|
Оператор Throw (генерация исключений, только C++) | ||
18
самый низкий |
,
|
Запятая | Слева направо |
Примечания
[ редактировать ]Таблица приоритетов определяет порядок привязки в связанных выражениях, если он явно не указан в круглых скобках.
- Например,
++x*3
неоднозначно без каких-либо правил приоритета. Таблица приоритетов говорит нам, что: x более тесно «связан» с ++, чем * , так что что угодно ++ делает (сейчас или позже — см. ниже), он делает это ТОЛЬКО для того, чтобы х (и неx*3
); это эквивалентно (++x
,x*3
). - Аналогично с
3*x++
, где хоть пост-фикс ++ предназначен для действия ПОСЛЕ того, как вычислено все выражение, таблица приоритетов ясно дает понять, что ТОЛЬКО x увеличивается (и НЕ3*x
). Действительно, выражение (tmp=x++
,3*tmp
) оценивается с помощью tmp является временным значением. Это функционально эквивалентно чему-то вроде (tmp=3*x
,++x
,tmp
).
- Абстрагируясь от вопроса приоритета или привязки, рассмотрим приведенную выше диаграмму для выражения 3+2*y[i]++. Задача компилятора — преобразовать диаграмму в выражение, в котором несколько унарных операторов (назовем их 3+( . ), 2*( . ), ( . )++ и ( . )[ i ]) конкурируют за связывание. к ю. Таблица порядка приоритетов разрешает окончательное подвыражение, над которым каждое из них действует: ( . )[ i ] действует только на y, ( . )++ действует только на y[i], 2*( . ) действует только на y[ i]++ и 3+( . ) действуют «только» на 2*((y[i])++). Важно отметить, что ЧТО подвыражение обрабатывается каждым оператором, ясно из таблицы приоритетов, но КОГДА действует каждый оператор, не определяется таблицей приоритетов; в этом примере оператор ( . )++ действует только на y[i] согласно правилам приоритета, но сами по себе уровни привязки не указывают время постфикса ++ (оператор ( . )++ действует только после y[i ] оценивается в выражении).
Многим операторам, содержащим многосимвольные последовательности, присваиваются «имена», составленные из имени оператора каждого символа. Например, +=
и -=
часто называются плюс равно(s) и минус равно(s) вместо более многословных «присваивание путем сложения» и «присваивание путем вычитания».
Связывание операторов в C и C++ определяется (в соответствующих стандартах) факторизованной грамматикой языка, а не таблицей приоритетов. Это создает некоторые тонкие конфликты. Например, в C синтаксис условного выражения следующий:
logical-OR-expression ? expression : conditional-expression
в то время как в C++ это:
logical-OR-expression ? expression : assignment-expression
Отсюда выражение:
e = a < d ? a++ : a = d
анализируется по-разному на двух языках. В C это выражение является синтаксической ошибкой, поскольку синтаксис выражения присваивания в C следующий:
unary-expression '=' assignment-expression
В C++ он анализируется как:
e = (a < d ? a++ : (a = d))
что является допустимым выражением. [11] [12]
Если вы хотите использовать запятую в качестве оператора в одном аргументе функции, назначении переменной или другом списке, разделенном запятыми, вам необходимо использовать круглые скобки, [13] [14] например.:
int a = 1, b = 2, weirdVariable = (++a, b), d = 4;
Критика приоритета побитовых операторов и операторов равенства
[ редактировать ]Приоритет побитовых логических операторов подвергся критике. [15] Концептуально, & и | — это арифметические операторы, такие как * и +.
Выражение a & b == 7
синтаксически анализируется как a & (b == 7)
тогда как выражение a + b == 7
анализируется как (a + b) == 7
. Это требует более частого использования скобок, чем в противном случае.
Исторически не существовало синтаксического различия между побитовыми и логическими операторами. В BCPL , B и ранней версии C операторы && ||
не существовало. Вместо & |
имели разное значение в зависимости от того, используются ли они в «контексте истинностного значения» (т. е. когда ожидалось логическое значение, например в if (a==b & c) {...}
он вел себя как логический оператор, но в c = a & b
он вел себя как побитовый). Он был сохранен для обеспечения обратной совместимости с существующими установками. [16]
Более того, в C++ (и более поздних версиях C) операции равенства, за исключением оператора трехстороннего сравнения, дают значения типа bool , которые концептуально представляют собой один бит (1 или 0) и как таковые не принадлежат должным образом к «побитовому "Операции.
Синонимы операторов C++
[ редактировать ]С++ определяет [17] определенные ключевые слова, которые будут выступать в качестве псевдонимов для ряда операторов:
Ключевое слово | Оператор |
---|---|
and |
&&
|
and_eq |
&=
|
bitand |
&
|
bitor |
|
|
compl |
~
|
not |
!
|
not_eq |
!=
|
or |
||
|
or_eq |
|=
|
xor |
^
|
xor_eq |
^=
|
Их можно использовать точно так же, как и символы пунктуации, которые они заменяют, поскольку это не один и тот же оператор под другим именем, а скорее простые замены токенов имени ( строки символов) соответствующего оператора. Это означает, что выражения (a > 0 and not flag)
и (a > 0 && !flag)
имеют одинаковые значения. Это также означает, что, например, bitand
Ключевое слово может использоваться для замены не только побитового оператора «и» , но и оператора адреса , и его можно даже использовать для указания ссылочных типов (например, int bitand ref = n
). Спецификация ISO C допускает использование этих ключевых слов в качестве макросов препроцессора в заголовочном файле. iso646.h
. Для совместимости с C C++ также предоставляет заголовок iso646.h
, включение которого не имеет никакого эффекта. До C++20 он также предоставлял соответствующий заголовок. ciso646
что тоже не имело никакого эффекта.
См. также
[ редактировать ]- Побитовые операции в C
- Битовые манипуляции
- Логический оператор
- Булева алгебра (логика)
- Таблица логических символов
- Орграфы и триграфы в C и C++
Ссылки
[ редактировать ]- ^ «Перегрузка операторов§Операторы сравнения» . cppreference.com .
- ^ «Стандартный С++» .
- ^ «Реализация целых чисел», GCC 4.3.3 , GNU .
- ^ «пользовательское преобразование» . Проверено 5 апреля 2020 г.
- ^ Явное преобразование типов в C++.
- ^ ISO/IEC 9899:201x Языки программирования — C. open-std.org — Комитет по стандартам C. 19 декабря 2011 г. с. 465.
- ^ стандарт ISO C 1999, раздел 6.5.6, примечание 71 (Технический отчет). ИСО. 1999.
- ^ «Приоритет оператора C — cppreference.com» . ru.cppreference.com . Проверено 16 июля 2019 г.
- ^ «Встроенные операторы C++, приоритет и ассоциативность» . docs.microsoft.com . Проверено 11 мая 2020 г.
- ^ «Приоритет операторов C++ — cppreference.com» . ru.cppreference.com . Проверено 16 июля 2019 г.
- ^ «Приоритет оператора C — cppreference.com» . ru.cppreference.com . Проверено 10 апреля 2020 г.
- ^ «Имеет ли тернарный оператор C/C++ тот же приоритет, что и операторы присваивания?» . Переполнение стека . Проверено 22 сентября 2019 г.
- ^ «Другие операторы — cppreference.com» . ru.cppreference.com . Проверено 10 апреля 2020 г.
- ^ «С++ — Как работает оператор запятая» . Переполнение стека . Проверено 1 апреля 2020 г.
- ^ История C § Неонатальный C , Bell labs .
- ^ «Re^10: следующий, если не выполнено условие» . www.perlmonks.org . Проверено 23 марта 2018 г.
- ^ ISO/IEC 14882:1998(E) Язык программирования C++ . open-std.org — Комитет по стандартам C++. 1 сентября 1998 г. стр. 40–41.
Внешние ссылки
[ редактировать ]- «Операторы», справочник по C++ (вики) .
- C Приоритет оператора
- Операторы увеличения и уменьшения Postfix: ++ и -- (сеть разработчиков), Microsoft, 17 августа 2021 г.