C++ でのプリインクリメント VS ポストインクリメント演算子
この記事では、C++ でのプリインクリメントとポストインクリメントの違いを紹介します。
C++ でのプリインクリメント操作とポストインクリメント操作の違い
どちらの演算も、単項インクリメント演算子(++
)に基づいています。これは、変数の値にアクセスする式で使用すると、動作がわずかに異なります。一般に、変数は、インクリメントまたはデクリメント演算子と組み合わせて、値を 1 だけ大きく/小さくすることができます。ただし、プリインクリメント操作は、最初に指定された変数を変更してから、それにアクセスします。一方、ポストインクリメント演算子は元の値にアクセスしてからインクリメントします。したがって、値がアクセスまたは格納される式で使用すると、演算子はプログラムにさまざまな影響を与える可能性があります。たとえば、次のサンプルコードは、2つの整数を 0
値に初期化し、それぞれの増分値を異なる演算子で出力しながら 5 回繰り返します。ポストインクリメントは 0
で始まり 4
で終わり、プレインクリメントは 1
で始まり 5
で終わることに注意してください。それにもかかわらず、両方の整数に格納される最終値は同じです-5
。
#include <iostream>
using std::cout;
using std::endl;
int main() {
int i = 0, j = 0;
while ((i < 5) && (j < 5)) {
cout << "i: " << i++ << " ";
cout << "j: " << ++j << endl;
}
cout << "End of the loop, both have equal values:" << endl;
cout << "i: " << i << " "
<< "j: " << j << endl;
exit(EXIT_SUCCESS);
}
出力:
i: 0 j: 1
i: 1 j: 2
i: 2 j: 3
i: 3 j: 4
i: 4 j: 5
End of the loop, both have equal values:
i: 5 j: 5
または、for
ループの条件式内で異なる表記を使用しても同じように動作します。両方のループが 5
回の反復で実行されます。ただし、通常はプリインクリメントを使用するスタイルが受け入れられています。これは、コードが最適化されていない場合に、よりパフォーマンス効率の高いバリアントになる可能性があります。
#include <iostream>
using std::cout;
using std::endl;
int main() {
int i = 0, j = 0;
while ((i < 5) && (j < 5)) {
cout << "i: " << i++ << " ";
cout << "j: " << ++j << endl;
}
cout << "End of the loop, both have equal values:" << endl;
cout << "i: " << i << " "
<< "j: " << j << endl;
cout << endl;
for (int k = 0; k < 5; ++k) {
cout << k << " ";
}
cout << endl;
for (int k = 0; k < 5; k++) {
cout << k << " ";
}
cout << endl;
exit(EXIT_SUCCESS);
}
出力:
i: 0 j: 1
i: 1 j: 2
i: 2 j: 3
i: 3 j: 4
i: 4 j: 5
End of the loop, both have equal values:
i: 5 j: 5
0 1 2 3 4
0 1 2 3 4
同じ変数の他の算術演算でポストインクリメントおよびプレインクリメント演算を使用しないでください
ポストインクリメント演算子とプリインクリメント演算子を同じ変数で使用すると、算術計算が完全に誤ってしまう可能性があることに注意してください。たとえば、ポストインクリメントと同じ変数の乗算を組み合わせると、コードを読み取るのが直感的でなくなり、十分な注意を払わないとエラーが発生しやすくなります。
#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::vector;
int main() {
vector<int> vec1 = {10, 22, 13, 41, 51, 15};
for (int &k : vec1) {
cout << k++ * k << ", ";
}
exit(EXIT_SUCCESS);
}
出力:
110, 506, 182, 1722, 2652, 240,