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 |