カワサキの技術ブログ

エンジニア志望によるゆるゆる備忘録。

【C++】インクリメント/デクリメント演算子を使いこなす

はじめに

for文やwhile文でよく「インクリメント演算子(++)」が使われていますよね。
文法書や解説書には、「デクリメント演算子(--)」や「前置/後置インクリメント演算子」が併せて解説されるのが定石となっています。
しかし、その場で理解できてても自分でコードを書く場合に使い分けができていないという方もいるのではないでしょうか。筆者はまさにそれです。
今回は、インクリメント演算子を使いこなすために違いをみていきたいと思います。

目次

  • はじめに
  • インクリメント/デクリメント演算子とは?
  • 前置と後置の違い
    • 前置インクリメント演算子
    • 後置インクリメント演算子
    • 前置と後置の違い
  • まとめ
  • 参考文献

インクリメント/デクリメント演算子とは?

インクリメント演算子

インクリメント演算子とは、対象の式(オペランド)の値を1増やす演算子です。

(オペランド)++ 

という書き方で使用されます。

デクリメント演算子

インクリメント演算子とは反対に、オペランドの値を1減らす演算子です。 インクリメント演算子と同じ要領で

(オペランド)--

という書き方で使用されます。

使い方

インクリメント/ デクリメント演算子の使い方をサンプルコードを用いて見ていきましょう。

#include <iostream>

using namespace std;

int main()
{
    int a = 0;
    cout  << a << '\n';

    //インクリメント演算子
    a++;
    cout << a << '\n';
    
    int b = 10;
    cout << b << '\n';

    //デクリメント演算子
    b--;
    cout << b << '\n';
}

実行結果

0    // a
1   // a++
10  // b
9   // b --


このように、インクリメント/デクリメント演算子を用いると対象の変数がそれぞれ1増える(減る)ことが分かります。

前置と後置の違い

では、このようにコードを書き換えるとどうなるでしょうか。

#include <iostream>

using namespace std;

int main()
{
    int a = 0;
    
    cout  << a << '\n';
    //インクリメント演算子
    cout << a++ << '\n';
    
    
    int b = 10;
    cout << b << '\n';
    //デクリメント演算子
    cout << b-- << '\n';
}

インクリメント/デクリメント演算子をcoutを用いた標準出力の中で用いている点が前のコードとの違いです。
実行結果

0    // a
0   // a++?
10  // b
10  // b--?

正しく演算子が反映されなくなってしまいました。

これは、a++(b--)がオペランドを評価した後に1増やしているから起こります。

実はインクリメント演算子には、
・ "++"がオペランドの前にある前置インクリメント演算子と、
・ "++"がオペランドの後ろにある
後置インクリメント演算子*
の2種類があります。なお、デクリメント演算子についても同様のことがいえます。
詳しくみていきましょう。

前置インクリメント演算子

"++"がオペランドの前(左側)にある形式が前置インクリメント演算子です。 これは、オペランドを1増やしてから評価します。

後置インクリメント演算子

"++"がオペランドの前(右側)にある形式が後置インクリメント演算子です。 これは、オペランドを評価してから1増やします。

前置と後置の違い

サンプルコードを用いて違いを見ていきましょう。

#include <iostream>

using namespace std;

int main()
{
    int engScore = 40;
    int mathScore = 60;
    int score;
    
    //scoreにはengScoreが代入され、その後1増える
    score  = engScore++;
    cout << "score :" <<score << '\n';
    cout << "engScore :" << engScore << '\n';
    
    //scoreには1増えたmathScoreが代入される
    score = ++mathScore;
    cout << " score :" <<score << '\n';
    cout << "mathScore :" << mathScore << '\n';
}

実行結果

score :40
engScore :41
score :61
mathScore :61

このように、前置と後置では1増えるタイミングに違いがあることが分かります。
なお、++scorescore += 1と同義になります。

まとめ

これまで見てきた通り、インクリメント/デクリメント演算子には「前置」と「後置」の2種類があることが分かりました。
for文やwhile文の条件として用いる場合などは、実現したいプログラムに合わせて使い分けるようにしましょう。

参考文献