インクリメント演算子++ ++aとa++の違いはどのようなときにでてくるのかな 0.1
ソーラー「インクリメント演算子++ですが
++aとかいてもa++と記述しても
変数aに格納されている値に1を加えたものを変数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・・・」
・・・ それは・・・ 値渡し( ^ω^)・・・
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます