Пространства имён
Варианты
Действия

Increment/decrement operators

Материал из cppreference.com
< cpp‎ | language

 
 
Язык С++
Общие темы
Управление программой
Операторы условного выполнения
Операторы повторения
Операторы перехода
Функции
объявление функции
объявление лямбда-функции
шаблон функции
спецификатор inline
спецификаторы исключений (устарело)
спецификатор noexcept (C++11)
Исключения
Пространства имён
объявление пространства имён
псевдонимы пространства имён
Типы
спецификатор decltype (C++11)
Спецификаторы
cv-спецификаторы
спецификаторы продолжительности хранения
спецификатор constexpr (C++11)
спецификатор auto (C++11)
спецификатор alignas (C++11)
Инициализация
Литералы
Выражения
Утилиты
Типы
typedef-объявление
объявление псевдонима типа (C++11)
атрибуты (C++11)
Приведения типов
неявные преобразования
const_cast-преобразование
static_cast-преобразование
dynamic_cast-преобразование
reinterpret_cast-преобразование
C-подобное и функциональное приведение типов
Выделение памяти
Классы
Особые свойства классовых функций
Специальные функции-члены
Шаблоны
шаблон класса
шаблон функции
специализация шаблона
упакованные параметры (C++11)
Разное
Ассемблерные вставки
 
Увеличение / уменьшение операторов увеличивает или уменьшает стоимость объекта.
Оригинал:
Increment/decrement operators increments or decrements the value of the object.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Operator name Syntax Over​load​able Prototype examples (for class T)
Inside class definition Outside class definition
pre-increment ++a Да T& T::operator++(); T& operator++(T& a);
pre-decrement --a Да T& T::operator--(); T& operator--(T& a);
post-increment a++ Да T T::operator++(int); T operator++(T& a, int);
post-decrement a-- Да T T::operator--(int); T operator--(T& a, int);
'Примечание'
Оригинал:
Notes
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • Префикс формы встроенных операторов обратных ссылок и постфиксной значения формы возвращения, и типичные пользовательские перегрузки по той же схеме, так что пользователю определенные операторы могут быть использованы таким же образом, как и встроенные модули. Однако, в определенный пользователем оператор перегрузки, любого типа могут быть использованы в качестве возвращаемого типа (в том числе void).
    Оригинал:
    Prefix forms of the built-in operators return references and postfix forms return values, and typical user-defined overloads follow the pattern so that the user-defined operators can be used in the same manner as the built-ins. However, in a user-defined operator overload, any type can be used as return type (including void).
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • int параметром является фиктивной параметр используется для различия между пре-и пост-в версиях операторов. Когда определяемых пользователем постфиксный оператор называется, значение, передаваемое в этом параметре всегда равна нулю, хотя она может быть изменена путем вызова оператора с использованием обозначений вызова функции, например, a.operator++(2).
    Оригинал:
    The int parameter is a dummy parameter used to differentiate between pre- and post- in versions of the operators. When the user-defined postfix operator is called, the value passed in that parameter is always zero, although it may be changed by calling the operator using function call notation, e.g. a.operator++(2).
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

Содержание

[править] Объяснение

Преинкремента и предекремента операторов увеличивает или уменьшает стоимость объекта и возвращает ссылку на результат.
Оригинал:
pre-increment and pre-decrement operators increments or decrements the value of the object and returns a reference to the result.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Пост-инкремент и пост-декремент создает копию объекта, увеличивает или уменьшает стоимость объекта и возвращает копию еще до увеличения или уменьшения.
Оригинал:
post-increment and post-decrement creates a copy of the object, increments or decrements the value of the object and returns the copy from before the increment or decrement.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

[править] Встроенный префикса оператора

Для каждого необязательно летучих квалифицированных арифметический тип A кроме bool, и для каждого необязательно летучих квалифицированных указатель P для возможного резюме квалифицированных тип объекта, следующие функции подписи участие в разрешении перегрузки
Оригинал:
For every optionally volatile-qualified arithmetic type A other than bool, and for every optionally volatile-qualified pointer P to optionally cv-qualified object type, the following function signatures participate in overload resolution:
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
A& operator++(A&)
bool& operator++(bool&)
(устарело)
P& operator++(P&)
A& operator--(A&)
P& operator--(P&)
Операнд встроенным прирост или уменьшение префикса оператора должны быть изменяемыми именующее (неконстантные ссылка) не-логический тип арифметической или указатель для завершения тип объекта. Для этих операнды, выражения ++x в точности эквивалентен x+=1, и выражение --x в точности эквивалентен x-=1, то есть, в результате обновленный операнд, возвращаются как именующее, и все арифметические правила преобразования и правила арифметики указателей определены для арифметических операторов применять.
Оригинал:
The operand of a built-in prefix increment or decrement operator must be a modifiable lvalue (non-const reference) of non-boolean arithmetic type or pointer to complete object type. For these operands, the expression ++x is exactly equivalent to x+=1, and the expression --x is exactly equivalent to x-=1, that is, the result is the updated operand, returned as lvalue, and all arithmetic conversion rules and pointer arithmetic rules defined for арифметических операторов apply.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Если операнд прединкремента оператор типа bool, он установлен на true (устарело).
Оригинал:
If the operand of the preincrement operator is of type bool, it is set to true (устарело).
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

[править] Встроенный постфиксными

Для каждого необязательно летучих квалифицированных арифметический тип A кроме bool, и для каждого необязательно летучих квалифицированных указатель P для возможного резюме квалифицированных тип объекта, следующие функции подписи участие в разрешении перегрузки
Оригинал:
For every optionally volatile-qualified arithmetic type A other than bool, and for every optionally volatile-qualified pointer P to optionally cv-qualified object type, the following function signatures participate in overload resolution:
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
A operator++(A&, int)
bool operator++(bool&, int)
(устарело)
P operator++(P&, int)
A operator--(A&, int)
P operator--(P&, int)
Операнд встроенным постфиксный оператор увеличения или уменьшения должны быть изменяемыми именующее (неконстантные ссылка) не-логический тип арифметической или указатель для завершения тип объекта. В результате prvalue, который является копией исходного значения операнда. Как побочный эффект, этот оператор изменяет значение своего аргумента arg, как будто оценивая arg += 1 или arg -= 1, для увеличения и уменьшения соответственно. Все арифметические правила преобразования и правила арифметики указателей определены для арифметических операторов применять.
Оригинал:
The operand of a built-in postfix increment or decrement operator must be a modifiable lvalue (non-const reference) of non-boolean arithmetic type or pointer to complete object type. The result is a prvalue, which is a copy the original value of the operand. As a side-effect, this operator modifies the value of its argument arg as if by evaluating arg += 1 or arg -= 1, for increment and decrement respectively. All arithmetic conversion rules and pointer arithmetic rules defined for арифметических операторов apply.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Если операнд постинкремента оператор типа bool, он установлен на true (устарело).
Оригинал:
If the operand of the postincrement operator is of type bool, it is set to true (устарело).
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

[править] Пример

#include <iostream>
int main()
{
    int n = 1;
    int n2 = ++n;
    int n3 = ++ ++n;
    int n4 = n++;
//    int n5 = n++ ++; // compile error
//    int n5 = n + ++n; // undefined behavior
    std::cout << "n = " << n << '\n'
              << "n2 = " << n2 << '\n'
              << "n3 = " << n3 << '\n'
              << "n4 = " << n4 << '\n';
}

Вывод:

n = 5
n2 = 2
n3 = 4
n4 = 4

[править] Заметки

Из-за побочных эффектах, связанных, встроенных операторов инкремента и декремента должны использоваться с осторожностью, чтобы избежать неопределенного поведения вследствие нарушения последовательности правил.
Оригинал:
Because of the side-effects involved, built-in increment and decrement operators must be used with care to avoid undefined behavior due to violations of последовательности правил.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Потому что временная копия объекта построены во время операции, преинкремента или предекремента операторы, как правило, более эффективны в условиях, когда возвращаемое значение не используется.
Оригинал:
Because a temporary copy of the object is constructed during the operation, pre-increment or pre-decrement operators are usually more efficient in contexts where the returned value is not used.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

[править] Стандартные библиотеки

Операторы инкремента и декремента перегружены для многих стандартных типов библиотек. В частности, каждый оператор Iterator перегрузок + +, и каждый оператор BidirectionalIterator перегрузки - даже если эти операторы холостого хода для данного итератора.
Оригинал:
Increment and decrement operators are overloaded for many standard library types. In particular, every Iterator overloads operator++ and every BidirectionalIterator overloads operator--, even if those operators are no-ops for the particular iterator.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
перегрузками для арифметических типов
Оригинал:
overloads for arithmetic types
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
увеличивает или уменьшает атомный значение на единицу
Оригинал:
increments or decrements the atomic value by one
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

(public функция-член std::atomic) [edit]
увеличивает или уменьшает количество тиков
Оригинал:
increments or decrements the tick count
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

(public функция-член std::chrono::duration)
перегрузки для типов итераторов
Оригинал:
overloads for iterator types
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
перемещает итератор
Оригинал:
advances the iterator
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

(public функция-член std::raw_storage_iterator)
перемещает итератор
Оригинал:
advances the iterator
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

(public функция-член std::reverse_iterator)
Уменьшает итератор
Оригинал:
decrements the iterator
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

(public функция-член std::reverse_iterator)
no-op
(public функция-член std::back_insert_iterator)
no-op
(public функция-член std::front_insert_iterator)
no-op
(public функция-член std::insert_iterator)
перемещает итератор
Оригинал:
advances the iterator
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

(public функция-член std::move_iterator)
Уменьшает итератор
Оригинал:
decrements the iterator
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

(public функция-член std::move_iterator)
авансы istream_iterator
Оригинал:
advances the istream_iterator
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

(public функция-член std::istream_iterator)
no-op
(public функция-член std::ostream_iterator)
авансы istreambuf_iterator
Оригинал:
advances the istreambuf_iterator
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

(public функция-член std::istreambuf_iterator)
no-op
(public функция-член std::ostreambuf_iterator)
авансы regex_iterator
Оригинал:
advances the regex_iterator
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

(public функция-член std::regex_iterator)
авансы regex_token_iterator
Оригинал:
advances the regex_token_iterator
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

(public функция-член std::regex_token_iterator)

[править] См. также

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

Common operators
назначение incrementNJdecrement арифметики логичной сравнение memberNJaccess другие

a = b
a = rvalue
a += b
a -= b
a *= b
a /= b
a %= b
a &= b
a |= b
a ^= b
a <<= b
a >>= b

++a
--a
a++
a--

+a
-a
a + b
a - b
a * b
a / b
a % b
~a
a & b
a | b
a ^ b
a << b
a >> b

!a
a && b
a || b

a == b
a != b
a < b
a > b
a <= b
a >= b

a[b]
*a
&a
a->b
a.b
a->*b
a.*b

a(...)
a, b
(type) a
? :

Special operators
static_cast преобразует один тип на другой совместимый
типа
Оригинал:
static_cast converts one type to another compatible type
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
dynamic_cast преобразует виртуальный базовый класс для производных class
Оригинал:
dynamic_cast converts virtual base class to derived class
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
const_cast преобразует тип совместимого типа с различными cv qualifiers
Оригинал:
const_cast converts type to compatible type with different cv qualifiers
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
reinterpret_cast преобразует тип несовместимы type
Оригинал:
reinterpret_cast converts type to incompatible type
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
new выделяет memory
Оригинал:
new allocates memory
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
delete освобождает memory
Оригинал:
delete deallocates memory
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
sizeof запрашивает размер type
Оригинал:
sizeof queries the size of a type
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
sizeof... запрашивает размер Параметр пакета (начиная с C++11)
Оригинал:
sizeof... queries the size of a Параметр пакета (начиная с C++11)
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
typeid запрашивает сведения о типе type
Оригинал:
typeid queries the type information of a type
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
noexcept проверяет выражение может вызвать исключение (начиная с C++11)
Оригинал:
noexcept checks if an expression can throw an exception (начиная с C++11)
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
alignof запросов выравнивание требований типа (начиная с C++11)
Оригинал:
alignof queries alignment requirements of a type (начиная с C++11)
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.