インクリメント演算子とは、変数名の前後に「++」と表記することによって、変数に1足すことができる。またデクリメント演算子は、変数名の前後に「--」と表記することによって、変数を1減じることができる。
それだけです。
ただし、この演算子の付加のしかたによっては、処理が異なることがあります。
例えば、ある整数型変数(x)にインクリメント演算子で加算される別の整数型変数(y)を代入するとき、
①変数名の前にインクリメント演算子を付加すると、次の処理をします。
※ここから先のxとyは、整数型変数を表す。
x=++y
↓
y=y+1
x=y
②変数名の後にインクリメント演算子を付加すると、次の処理をします。
x=y++
↓
x=y
y=y+1
このように、演算子を付加する位置によって、処理の順序が変わります。
デクリメント演算子でも同様の処理順序で行われます。
これを①のように先に演算子を付加することを「前置」、②のように後に演算子を付加することを「後置」と呼びます。
ちなみにこの演算子は、処理の優先順位では高位(先に処理される)であり、「前置」「後置」では、「後置」の方が先に処理されます。(演算子備忘録参照)※編集中
この演算子は、ただ単に変数を1増減させるだけですが、関数の引数や、処理文、条件文等にこの演算子で記述すると、その変数自体にも1増減することになります。
つまり、次のことが言えます。
①関数の例
printf("%d",++x);≠printf("%d",x++);≠printf("%d",x+1);
②条件文の例
while(--x>0)≠while(x-->0)≠while(x-1>0)
これだけ見てもよく解らないですね…
①の左と真ん中の文は、インクリメント演算子を用いて記述した文で、右の文は、加算演算子を用いて記述した文です。見た感じは同じですが、意味は違います。
左の記述では、xという変数にインクリメント演算子によって、変数が1加算します。中央も同様ですが、加算されるタイミングが異なります。前置の場合は、関数printfにxが代入される前に値を加算させ、後置の場合、関数printfにxが代入された後に値を加算させます。
右の記述は、xという変数には、加算演算子によって、変数を1加算させた値を変数として返します。つまり、変数x自体には、1増えることはありません。
②の条件文の例も原理はほぼ同様のことが言えます。
このことを利用したプログラムの例を以下に示す。
例:デクリメント演算の前置と後置による処理の順序調査
#include <stdio.h>
int main()
{
int a;
a=5;
while(a-->1) printf("%d",a);//①デクリメント演算子を後置
a=5;
while(--a>1) printf("%5d ",a);//②デクリメント演算子を前置
a=5;
while(5+a-->1) printf("%10d ",a);//③デクリメント演算子を後置、5の加算を前に記述した場合
a=5;
while(a--+5>1) printf("%15d ",a);//④デクリメント演算子を後置、5の加算を後に記述した場合
return 0;
}
このプログラムを実行すると、デクリメント演算と、5の加算と条件判断の順序を調べることができます。この文は、1より大きい値(2以上)のときに値を出力します。
結果(実行結果を見やすく改変しました)※本来の実行結果の表示ではありません。
①4321
②432
③43210-1-2-3-4
④43210-1-2-3-4
①(後置)は、最後に1が出力されたため、演算のタイミングは、条件判断の後と考えることができる。
②(前置)は、最後に1が出力されなかったため、演算のタイミングは、条件判断の前と考えることができる。
③と④では、1以下の値が-4まで出力されたため、5の加算は、条件判断の前に行われていることが分かる。また、-4が出力されているということは、5+(-4)=1が処理の結果が真の判定となった事になる。よって、デクリメント演算は条件判定の後に行われている。(この判定の時の式は、5+(-3)>1、その後デクリメント)③、④の値の結果が同じだったということは、③と④では、処理が同じということになる。
例:階乗(factorial)を求めるプログラム(再帰アルゴリズム使用、前の雑談のプログラムの改造版)
#include <stdio.h>
int factorial(int n)
{
while(n-->1)return n*factorial(n); //n--によってwhileの条件判定の度にnの値が減じられる。
return 1;
}
int main()
{
int a;
printf("回数入力");
scanf("%d",&a);
printf("%d\n",factorial(a+1)); //a+1によって、a+1が代入されるが変数a自体に変化はない。
return 0;
}
このプログラムの関数factorialの部分のwhileの条件文内の処理は、「変数nを1減じてから条件『n>1である』を調べる」という処理を行います。よってこの関数を最初に呼び出す(1回目の呼び出し)と、その解は、問題の数の-1の解が出てしまうので、main関数内の解を出力するときに、factorial関数の引数に+1を付加して処理を行っています。
※これは、直接再帰で呼び出したとき、先に「n++」や「n+1」などがあると、無限ループを起こすため、nの値を加算させるには、factorial関数外つまりmain関数側で操作しなければなりません。
そのため、このプログラムは、あまり効率的ではないです。
なお、先述通りこの変数aに「+1」を付けていますので、この変数自体には変化しません。