インクリメント演算子、デクリメント演算子

インクリメント演算子とは、変数名の前後に「++」と表記することによって、変数に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」を付けていますので、この変数自体には変化しません。