Jump to content

Операторы в C и 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) Нет Нет

Примечания:

  1. ^ Оператор модуля работает только с целочисленными операндами, для чисел с плавающей запятой вместо этого необходимо использовать библиотечную функцию (например, fmod).
  2. ^ О трехстороннем сравнении C++20
  3. ^ Jump up to: а б В контексте iostreams в C++ авторы часто ссылаются на << и >> как операторы «помещение» или «вставка в поток» и «получение из» или «извлечение потока» соответственно.
  4. ^ Jump up to: а б Согласно стандарту C99 сдвиг вправо отрицательного числа определяется реализацией. Большинство реализаций, например GCC, [3] используйте арифметический сдвиг (т. е. расширение знака), но логический сдвиг . возможен и
  5. ^ Фактический адрес объекта с перегруженным operator & можно получить с std::addressof
  6. ^ Тип возвращаемого значения operator->() должен быть типом, для которого -> можно применить операцию, например тип указателя. Если x имеет тип C где C перегрузки operator->(), x->y расширяется до x.operator->()->y.
  7. ^ Мейерс, Скотт (октябрь 1999 г.), «Реализация оператора->* для интеллектуальных указателей» (PDF) , Журнал доктора Добба , Aristeia .
  8. ^ Хотя :: Знак пунктуации существует в C, начиная с C23, он не используется в качестве оператора разрешения области.
  9. ^ О определяемых пользователем литералах C++11
  10. ^ Круглые скобки не нужны при определении размера значения, а только при определении размера типа. Однако обычно их используют независимо. [ нужна ссылка ]
  11. ^ C++ определяет alignof оператор, тогда как C определяет _Alignof (C23 определяет оба). Оба оператора имеют одинаковую семантику.
  12. ^ Имя типа также можно вывести (например, new auto), если указан инициализатор.
  13. ^ Размер массива также можно определить, если указан инициализатор.

Приоритет оператора

[ редактировать ]

Ниже представлена ​​таблица, в которой перечислены приоритет и ассоциативность всех операторов языков 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

самый низкий

, Запятая Слева направо

[8] [9] [10]

Примечания

[ редактировать ]

Таблица приоритетов определяет порядок привязки в связанных выражениях, если он явно не указан в круглых скобках.

  • Например, ++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 что тоже не имело никакого эффекта.

См. также

[ редактировать ]
  1. ^ «Перегрузка операторов§Операторы сравнения» . cppreference.com .
  2. ^ «Стандартный С++» .
  3. ^ «Реализация целых чисел», GCC 4.3.3 , GNU .
  4. ^ «пользовательское преобразование» . Проверено 5 апреля 2020 г.
  5. ^ Явное преобразование типов в C++.
  6. ^ ISO/IEC 9899:201x Языки программирования — C. open-std.org — Комитет по стандартам C. 19 декабря 2011 г. с. 465.
  7. ^ стандарт ISO C 1999, раздел 6.5.6, примечание 71 (Технический отчет). ИСО. 1999.
  8. ^ «Приоритет оператора C — cppreference.com» . ru.cppreference.com . Проверено 16 июля 2019 г.
  9. ^ «Встроенные операторы C++, приоритет и ассоциативность» . docs.microsoft.com . Проверено 11 мая 2020 г.
  10. ^ «Приоритет операторов C++ — cppreference.com» . ru.cppreference.com . Проверено 16 июля 2019 г.
  11. ^ «Приоритет оператора C — cppreference.com» . ru.cppreference.com . Проверено 10 апреля 2020 г.
  12. ^ «Имеет ли тернарный оператор C/C++ тот же приоритет, что и операторы присваивания?» . Переполнение стека . Проверено 22 сентября 2019 г.
  13. ^ «Другие операторы — cppreference.com» . ru.cppreference.com . Проверено 10 апреля 2020 г.
  14. ^ «С++ — Как работает оператор запятая» . Переполнение стека . Проверено 1 апреля 2020 г.
  15. ^ История C § Неонатальный C , Bell labs .
  16. ^ «Re^10: следующий, если не выполнено условие» . www.perlmonks.org . Проверено 23 марта 2018 г.
  17. ^ ISO/IEC 14882:1998(E) Язык программирования C++ . open-std.org — Комитет по стандартам C++. 1 сентября 1998 г. стр. 40–41.
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 909cec67d613d79a7957fe15ed8db38c__1722066780
URL1:https://arc.ask3.ru/arc/aa/90/8c/909cec67d613d79a7957fe15ed8db38c.html
Заголовок, (Title) документа по адресу, URL1:
Operators in C and C++ - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)