この章のテーマ §
前置、後置のインクリメント、デクリメント演算子を学習します。これらは副作用を発生させる危険な機能ですが、飲み込むととても便利です。
前提知識 §
Console.WriteLineメソッド, 文字列の基礎, 変数の基礎, int型
解説 §
前置、後置のインクリメント(1加算)、デクリメント(1減算)演算子(++x/--x/x++/x--)は、変数に1を足す、1を引くという機能を持った演算子です。値に1を足す、1を引くではありません。変数を変化させます。
++が付く演算子は1を足します。
--が付く演算子は1を引きます。
変数名の手前に書くと、式を計算する前に変化させます。後に書くと式を計算した後で変化させます。
これを使うと、たとえば配列を順次アクセスする際にarray[x++]のように書くことができて便利です。ここでarrayは配列の名前、xは添え字を格納した変数名とします。こう書いておくと、次に利用する添え字の値を式の中で更新できます。
単に変数に1を足す、1を引く場合にも使います。a = a + 1よりもa += 1よりもa++の方が短いからです。
こういった、式を計算する際に変数を変化させることを副作用といいます。副作用を含む式は、複数の変数の値を変化させることがあるので要注意です。
罠の数々 §
- どういう順番に加算減算が行われるかの規定はないので、1つの式の中で変数を加工しつつ参照するコードはトラブルが起きやすい。曖昧な使い方、使い過ぎは厳禁である
- ベテランはわりと使うので、比較的よく見かける機能である。ベテランはものぐさである。可読性が落ちることもないので、短く書ければその方が良いのだ
- 負数化する-演算子を2つ並べて書きたい時は、中間に空白を入れよう。連続して書くとデクリメント演算子扱いされてしまう
参考リンク §
算術演算子 (C# リファレンス)
サンプルソース: incrementDecrement §
Console.WriteLine("後置インクリメント演算子の場合");
int a = 2;
int b = a++ * 2;
Console.WriteLine($"a={a}");
Console.WriteLine($"b={b}");
Console.WriteLine("前置インクリメント演算子の場合");
int c = 2;
int d = ++c * 2;
Console.WriteLine($"c={c}");
Console.WriteLine($"d={d}");
実行結果 §
後置インクリメント演算子の場合
a=3
b=4
前置インクリメント演算子の場合
c=3
d=6
リポジトリ §
https://github.com/autumn009/CSharpPrimer2
練習問題 §
以下のプログラムの実行結果を予測してみよう。
var a = 1;
var b = ++--a;
Console.WriteLine(b);
- 0
- 1
- 2
- 3
- コンパイルエラー
[[解答]]