インクリメント演算子++ ++aとa++の違いはどのようなときにでてくるのかな 0.1

ソーラー「インクリメント演算子++ですが


++aとかいてもa++と記述しても


変数aに格納されている数値に1をプラスするという機能になっています。


次のプログラムをご覧ください


++aの場合


#include <stdio.h>


int main (void)

{

int a;

a=10;

++a;


printf("aの値は%dです\n",a);


return 0;

}


コンパイル結果は


aの値は11です


となり


a++の場合も


#include <stdio.h>


int main (void)

{

int a;

a=10;

a++;


printf("aの値は%dです\n",a);


return 0;

}


コンパイル結果は


aの値は11です


となります。


++a;の場合もa++;の場合も


変数aに格納されている数値10に1が加えられています。」


ソーラー 「ふ~ん ならば


プログラムの中で


変数aに格納されている数値に1を加えるという操作を行いたいとき


++a;でもa++;でもいいってことかな(^^)」


アレサ 「ところが


a++;と++a;では


プログラムのなかでの使われ方によって


違いがでてくるんですの。」


ソーラー 「え~ 違い~


aに1を加えるだけの操作に違いがでてくるの~」


アレサ「はい、次の2つのプログラムを


ご覧ください


まずは、このプログラム


#include <stdio.h>


int main (void)

{

int a;

int b;

b=10;

a=b++;


printf("bの値は%dです\n",b);

printf("aの値は%dです\n",a);

return 0;

}


コンパイル結果は


bの値は11です

aの値は10です

となります。


ソーラー 「???

b++;の操作によって


変数bの今格納している値10に1を足したもの11が


変数bに代入され


変数bの値が11になっているのはわかる。


(b++;


が実行されると


変数bの今格納している値に1をたしたものが


変数bに代入されます。)


つまり


b++;

b=b+1;


と等しい命令文なのですね。)


けど???なぜ?


a=b++;となっているのに


コンパイル結果は


aの値は10で bの値は11と なってるのかな?


aの値はbの値と同じ11にならないのかな?」


アレサ「01110001111・・・そうですね。


不思議ですね。」



アレサ「


🌞  🌞  🌞


a=b++;


の実行において


変数aに変数bを代入するという


a=b


という操作の方が


変数bの今格納している値10に1を加えたものを


変数bに代入するというインクリメント演算子++の操作より


作用させる優先順位が高いからなのです。


そのため


a=b++;においては


a=bという操作がまず行われ


変数bの格納している値10が変数aに代入され


変数aの格納している値は10となり、


そのあと


a=bとは一切関係なく


b++;


により


変数bの今、格納している値10に1を足したもの11が


変数bに代入され


変数bの格納している値は11となります。


そのため


変数aの格納している値は10のまま11に変化しません。


🌞  🌞  🌞


このことを



変数aと名前の付けられたメモリと


変数bという名前の付けられたメモリが


独立して存在しているということを


考慮すれば


まず


a=b++;


の実行において


変数aのメモリに変数bのメモリに格納されているデータ10が


格納されます。


その後


b++;


の操作によって


変数bの今格納している値10に1を足したもの11が


変数bに代入され


変数bの値が11になるのですが


変数aと名前の付けられたメモリと


変数bと名前の付けられたメモリは


お互いに独立して存在しているので


変数bと名前の付けられたメモリに格納された数値が


10から11になったとしても


変数aと名前の付けられたメモリに格納された値10は


変化しないというわけです。



それに対し


こちらのプログラムでは

👇

#include <stdio.h>


int main (void)

{

int a;

int b;

b=10;

a=++b;


printf("bの値は%dです\n",b);

printf("aの値は%dです\n",a);

return 0;

}

コンパイル結果は


bの値は11です

aの値は11です

となります。


このプログラムの場合の


命令文

a=++b;においては


変数bの今格納している値に1をたしたものを


変数bに代入するというインクリメント演算子++の操作のほうが


aにbを代入する


a=b


という操作より優先順位が高いため


まず

b=10に対して++b;という操作が加えられ


b=11となり


その後その11を格納している変数bが


a=b;


という操作によって


変数aに代入され


変数aの格納している値は11


となっています。



変数bと名前の付けられたメモリに格納されている数値



++b;


により


10から11になります。


この11が


変数aと名前の付けられたメモリに格納されるので


変数aと名前の付けられたメモリに格納される数値は11となる


ともいえます。」


ソーラー 「ふ~ん


a=b++;

a=++b;


の例をみてきたように


2つの演算子

=(代入演算子)

++(インクリメント演算子)



命令文で使用される場合


さきに

=代入演算子が実行されるか

それとも

++インクリメント演算子が実行されるか


順番があるんだね。


つまり


異なる演算子同士で


どちらの演算子が先に実行されるかの優先順序があるんだね。


なんだか 感心、感心


多分、


一見すると


a=b++;


が実行されて


変数aに変数bの値を代入して


そのあと 変数aの値を変化させず


変数bの値だけに独立して++(1を加える)


を作用させるようなシステムは


分かりにくい感じがするけど


メモリにデータを格納させるという点からみると


とても自然なことなのかもしれないね」


アレサ 「000000101010100・・・


そうですね、 これからプログラムを組んでいけば


このa=b++;


の機能が有効となってくるプログラムに


であうかもしれませんね。001010101010101001・・・」






 



 ・・・   それは・・・  値渡し( ^ω^)・・・



















  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます