| General topics | ||||||||||||||||
| Flow control | ||||||||||||||||
| Conditional execution statements | ||||||||||||||||
| Iteration statements (loops) | ||||||||||||||||
| Jump statements | ||||||||||||||||
| Functions | ||||||||||||||||
| Function declaration | ||||||||||||||||
| Lambda function expression | ||||||||||||||||
inline specifier | ||||||||||||||||
| Dynamic exception specifications(until C++17*) | ||||||||||||||||
noexcept specifier(C++11) | ||||||||||||||||
| Exceptions | ||||||||||||||||
| Namespaces | ||||||||||||||||
| Types | ||||||||||||||||
| Specifiers | ||||||||||||||||
| ||||||||||||||||
| Storage duration specifiers | ||||||||||||||||
| Initialization | ||||||||||||||||
| Expressions | ||||||||||||||||
| Alternative representations | ||||||||||||||||
| Literals | ||||||||||||||||
| Boolean -Integer -Floating-point | ||||||||||||||||
| Character -String -nullptr(C++11) | ||||||||||||||||
| User-defined(C++11) | ||||||||||||||||
| Utilities | ||||||||||||||||
| Attributes(C++11) | ||||||||||||||||
| Types | ||||||||||||||||
typedef declaration | ||||||||||||||||
| Type alias declaration(C++11) | ||||||||||||||||
| Casts | ||||||||||||||||
| Memory allocation | ||||||||||||||||
| Classes | ||||||||||||||||
| Class-specific function properties | ||||||||||||||||
| ||||||||||||||||
| Special member functions | ||||||||||||||||
| Templates | ||||||||||||||||
| Miscellaneous | ||||||||||||||||
| General | ||||
| Literals | ||||
| Operators | ||||
| Conversions | ||||
Increment/decrement operators increment or decrement the value of the object.
| Operator name | Syntax | Overloadable | Prototype examples (forclass T) | |
|---|---|---|---|---|
| Inside class definition | Outside class definition | |||
| pre-increment | ++a | Yes | T& T::operator++(); | T& operator++(T& a); |
| pre-decrement | --a | Yes | T& T::operator--(); | T& operator--(T& a); |
| post-increment | a++ | Yes | T T::operator++(int); | T operator++(T& a,int); |
| post-decrement | a-- | Yes | T T::operator--(int); | T operator--(T& a,int); |
| ||||
Contents |
The prefix increment and decrement expressions have the form
++expression | |||||||||
--expression | |||||||||
| (until C++17) |
| (since C++17) |
| (since C++20) |
| (since C++20) |
Inoverload resolution against user-defined operators, for every optionally volatile-qualified arithmetic typeA other thanbool, and for every optionally volatile-qualified pointerP to optionally cv-qualified object type, the following function signatures participate in overload resolution:
A& operator++(A&) | ||
bool& operator++(bool&) | (deprecated)(until C++17) | |
P& operator++(P&) | ||
A& operator--(A&) | ||
P& operator--(P&) | ||
The postfix increment and decrement expressions have the form
expression++ | |||||||||
expression-- | |||||||||
The result of postfix increment or decrement is the value obtained by applying thelvalue-to-rvalue conversion toexpression (before modification). The type of the result is the cv-unqualified version of the type ofexpression.
Ifexpression is not a modifiable lvalue of an arithmetic type other than (possibly cv-qualified)bool(since C++17), or a pointer to a complete object type, the program is ill-formed.
If the type ofexpression is volatile-qualified, the increment or decrement is deprecated. | (since C++20) |
++ operator.-- operator.The value computation of a postfix increment or decrement issequenced before the modification ofexpression. With respect to an indeterminately-sequenced function call, the operation of a postfix increment or decrement is a single evaluation.
Inoverload resolution against user-defined operators, for every optionally volatile-qualified arithmetic typeA other thanbool, and for every optionally volatile-qualified pointerP to optionally cv-qualified object type, the following function signatures participate in overload resolution:
A operator++(A&,int) | ||
bool operator++(bool&,int) | (deprecated)(until C++17) | |
P operator++(P&,int) | ||
A operator--(A&,int) | ||
P operator--(P&,int) | ||
#include <iostream> int main(){int n1=1;int n2=++n1;int n3=++++n1;int n4= n1++;// int n5 = n1++ ++; // error// int n6 = n1 + ++n1; // undefined behaviorstd::cout<<"n1 = "<< n1<<'\n'<<"n2 = "<< n2<<'\n'<<"n3 = "<< n3<<'\n'<<"n4 = "<< n4<<'\n';}
Output:
n1 = 5n2 = 2n3 = 4n4 = 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 ofsequencing rules.
Because a temporary copy of the object is constructed during post-increment and post-decrement, pre-increment or pre-decrement operators are usually more efficient in contexts where the returned value is not used.
Increment and decrement operators are overloaded for many standard library types. In particular, everyLegacyIterator overloadsoperator++ and everyLegacyBidirectionalIterator overloadsoperator--, even if those operators are no-ops for the particular iterator.
overloads for arithmetic types | |
| increments or decrements the atomic value by one (public member function of std::atomic<T>)[edit] | |
| increments or decrements the tick count (public member function of std::chrono::duration<Rep,Period>)[edit] | |
overloads for iterator types | |
| advances the iterator (public member function of std::raw_storage_iterator<OutputIt,T>)[edit] | |
advances or decrements thereverse_iterator(public member function of std::reverse_iterator<Iter>)[edit] | |
advances or decrements themove_iterator(public member function of std::move_iterator<Iter>)[edit] | |
| no-op (public member function of std::front_insert_iterator<Container>)[edit] | |
| no-op (public member function of std::back_insert_iterator<Container>)[edit] | |
| no-op (public member function of std::insert_iterator<Container>)[edit] | |
| advances the iterator (public member function of std::istream_iterator<T,CharT,Traits,Distance>)[edit] | |
| no-op (public member function of std::ostream_iterator<T,CharT,Traits>)[edit] | |
| advances the iterator (public member function of std::istreambuf_iterator<CharT,Traits>)[edit] | |
| no-op (public member function of std::ostreambuf_iterator<CharT,Traits>)[edit] | |
| advances the iterator to the next match (public member function of std::regex_iterator<BidirIt,CharT,Traits>)[edit] | |
| advances the iterator to the next submatch (public member function of std::regex_token_iterator<BidirIt,CharT,Traits>)[edit] | |
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| CWG 2855 | C++98 | usual arithmetic conversions are applied for built-in pre-increment and pre-decrement, but were not applied for their postfix counterparts[1] | also applied |
| CWG 2901 | C++98 | lvalue-to-rvalue conversions were not applied for built-in post-increment and post-decrement | applied |
| Common operators | ||||||
|---|---|---|---|---|---|---|
| assignment | increment decrement | arithmetic | logical | comparison | member access | other |
a= b | ++a | +a | !a | a== b | a[...] | function call a(...) |
| comma a, b | ||||||
| conditional a? b: c | ||||||
| Special operators | ||||||
static_cast converts one type to another related type | ||||||
C documentation forIncrement/decrement operators |