インクリメント/デクリメント演算子
インクリメント/デクリメント演算子はオブジェクトの値をインクリメントまたはデクリメントします。
| 演算子の名前 | 構文 | オーバーロード可能 | プロトタイプの例 (class T に対して)
| |
|---|---|---|---|---|
| クラス定義の内側 | クラス定義の外側 | |||
| 前置インクリメント | ++a
|
Yes | T& T::operator++();
|
T& operator++(T& a);
|
| 前置デクリメント | --a
|
Yes | T& T::operator--();
|
T& operator--(T& a);
|
| 後置インクリメント | a++
|
Yes | T T::operator++(int);
|
T operator++(T& a, int);
|
| 後置デクリメント | a--
|
Yes | T T::operator--(int);
|
T operator--(T& a, int);
|
| ||||
説明
前置インクリメントおよび前置デクリメント演算子は、オブジェクトの値をインクリメントまたはデクリメントし、その結果への参照を返します。
後置インクリメントおよび後置デクリメント演算子は、オブジェクトのコピーを作成し、オブジェクトの値をインクリメントまたはデクリメントし、そのインクリメントまたはデクリメント前のコピーを返します。
|
これらの演算子の組み込みバージョンの被演算子として volatile 修飾された非クラス型の左辺値を使用することは非推奨です。 |
(C++20以上) |
組み込みの前置演算子
前置インクリメントおよびデクリメント式は以下の形式を持ちます。
++ expr
|
|||||||||
-- expr
|
|||||||||
組み込みの前置インクリメントまたはデクリメント演算子の被演算子 expr は、ブーリアンでない (C++17以上)算術型、または完全に定義されたオブジェクト型へのポインタの、変更可能な (const でない) 左辺値でなければなりません。 ブーリアンでない被演算子の場合、式 ++x は x += 1 とまったく同等であり、式 --x は x -= 1 とまったく同等です。 つまり、前置インクリメントまたはデクリメントは、変更された被演算子を表す左辺値式です。 算術演算子に対して定義されているすべての算術変換のルールおよびポインタ算術のルールが適用され、被演算子および式の戻り値の型に適用される暗黙の変換 (もしあれば) を決定します。
前置インクリメント演算子の被演算子が bool 型の場合、それは true に設定されます。(非推奨) (C++17未満)
ユーザ定義の演算子に対するオーバーロード解決において、 bool 以外のすべての算術型 (およびその volatile 修飾された型) A に対して、およびオブジェクト型 (およびその cv 修飾された型) へのすべてのポインタ (および volatile 修飾されたポインタ) P に対して、以下の関数シグネチャがオーバーロード解決に参加します。
A& operator++(A&) |
||
bool& operator++(bool&) |
(非推奨)(C++17未満) | |
P& operator++(P&) |
||
A& operator--(A&) |
||
P& operator--(P&) |
||
組み込みの後置演算子
後置インクリメントおよびデクリメント演算子式は以下の形式を持ちます。
expr ++
|
|||||||||
expr --
|
|||||||||
組み込みの後置インクリメントまたはデクリメント演算子の被演算子 expr は、ブーリアンでない (C++17以上)算術型、または完全に定義されたオブジェクト型へのポインタの、変更可能な (const でない) 左辺値でなければなりません。 結果は被演算子の元の値のコピーの prvalue です。 副作用として、ブーリアンでない演算子の場合、式 x++ は x += 1 を評価したかのように被演算子の値を変更し、式 x-- は x -= 1 を評価したかのように被演算子の値を変更します。 算術演算子に対して定義されているすべての算術変換のルールおよびポインタ算術のルールが適用され、被演算子および式の戻り値の型に適用される暗黙の変換 (もしあれば) を決定します。
後置インクリメント演算子の被演算子が bool 型の場合、それは true に設定されます。(非推奨) (C++17未満)
ユーザ定義の演算子に対するオーバーロード解決において、 bool 以外のすべての算術型 (およびその volatile 修飾された型) A に対して、およびオブジェクト型 (またはその cv 修飾された型) へのポインタ (および volatile 修飾されたポインタ) P に対して、以下の関数シグネチャがオーバーロード解決に参加します。
A operator++(A&, int) |
||
bool operator++(bool&, int) |
(非推奨)(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 behavior
std::cout << "n1 = " << n1 << '\n'
<< "n2 = " << n2 << '\n'
<< "n3 = " << n3 << '\n'
<< "n4 = " << n4 << '\n';
}
出力:
n1 = 5
n2 = 2
n3 = 4
n4 = 4
ノート
発生する副作用のため、組み込みのインクリメントおよびデクリメント演算子は、評価順序のルールの違反による未定義動作を避けるために、注意して使用しなければなりません。
後置インクリメントおよび後置デクリメント中にオブジェクトの一時コピーが構築されるため、返される値が使用されない文脈では、通常、前置インクリメントまたは前置デクリメント演算子の方が効率的です。
標準ライブラリ
インクリメントおよびデクリメント演算子は標準ライブラリの多くの型に対してオーバーロードされています。 特に、すべての LegacyIterator は operator++ をオーバーロードし、すべての LegacyBidirectionalIterator は operator-- をオーバーロードします (たとえ特定のイテレータについてはこれらの演算子が無操作であっても)。
算術型に対するオーバーロード | |
| アトミック値を1つインクリメントまたはデクリメントします ( std::atomic<T>のパブリックメンバ関数)
| |
| 刻み数をインクリメントまたはデクリメントします ( std::chrono::duration<Rep,Period>のパブリックメンバ関数)
| |
イテレータ型に対するオーバーロード | |
| イテレータを進めます ( std::raw_storage_iterator<OutputIt,T>のパブリックメンバ関数)
| |
| イテレータをインクリメントもしくはデクリメントします ( std::reverse_iterator<Iter>のパブリックメンバ関数)
| |
| イテレータをインクリメントもしくはデクリメントします ( std::move_iterator<Iter>のパブリックメンバ関数)
| |
| 何もしません ( std::front_insert_iterator<Container>のパブリックメンバ関数)
| |
| 何もしません ( std::back_insert_iterator<Container>のパブリックメンバ関数)
| |
| 何もしません ( std::insert_iterator<Container>のパブリックメンバ関数)
| |
| イテレータを進めます ( std::istream_iterator<T,CharT,Traits,Distance>のパブリックメンバ関数)
| |
| 何もしません ( std::ostream_iterator<T,CharT,Traits>のパブリックメンバ関数)
| |
| イテレータを進めます ( std::istreambuf_iterator<CharT,Traits>のパブリックメンバ関数)
| |
| 何もしません ( std::ostreambuf_iterator<CharT,Traits>のパブリックメンバ関数)
| |
| イテレータを次のマッチに進めます ( std::regex_iterator<BidirIt,CharT,Traits>のパブリックメンバ関数)
| |
| イテレータを次の部分マッチに進めます ( std::regex_token_iterator<BidirIt,CharT,Traits>のパブリックメンバ関数)
| |
関連項目
| 一般的な演算子 | ||||||
|---|---|---|---|---|---|---|
| 代入 | インクリメント デクリメント |
算術 | 論理 | 比較 | メンバアクセス | その他 |
|
|
|
|
|
|
|
|
| 特殊な演算子 | ||||||
|
static_cast は型を別の関連する型に変換します。 | ||||||
インクリメント/デクリメント演算子 の C言語リファレンス
|