マクロで定義された自作関数を使って お手軽にmain関数内で定義された配列に格納されている数値を変更してみます。
ソーラー
「さあて 今
次のプログラムのように
マクロを #define f(a) a+1
と定義して
f(a)のaに
main関数内で
int b=2;
と
変数宣言され
作製された変数b
を代入することにより
main関数内で定義された変数bに格納されていた数値を
2から3に変更できました。
#include<stdio.h>
#define f(a) a+1
int main(void){
int b=2;
printf("%d\n",f(b));
printf("%d\n",b);
return 0;
}
コンパイル結果
3
2
ソーラー「自作関数にポインタ変数を使った時と比べて
ずいぶん簡単に
🍓main関数内で変数宣言され作製された変数bに格納されている数値を
変更できたね🍓
となると
main関数内で変数宣言され作製された変数に
格納されている数値だけでなく
main関数内で定義された配列
main関数内で定義された構造体
main関数内で定義された構造体の配列
に格納されている数値を
マクロで定義された自作関数を使って変更できるか
ということになってくるよね。
なんか
超簡単な 予・感・・・・・がするね」
アレサ「そうですね。
ここはそのとおり楽しい結果になりそうです。」
ソーラー「では
まずは
main関数内で定義された配列
に格納されている数値を
マクロで定義された自作関数を使って変更してみよっか
アレサ🐤」
アレサ「は~い さっそくとりかかりましょう。 ソーラーさん🌞」
ソーラー
「main関数内でhairetuの配列宣言、配列変数への数値の代入
int hairetu[3];
hairetu[0]=1;
hairetu[1]=2;
hairetu[2]=3;
が行われているとします。
このとき配列hairetu内の配列変数
hairetu[0]
hairetu[1]
hairetu[2]
には
hairetu[0]=1;
hairetu[1]=2;
hairetu[2]=3;
と数値が格納されています
これから
配列変数
hairetu[0]
hairetu[1]
hairetu[2]
に格納されている数値
1
2
3
を
マクロで定義された自作関数を使って
1を加えて
配列変数
hairetu[0]
hairetu[1]
hairetu[2]
に格納されている数値を
2
3
4
に
変更するプログラムを構成しちゃうぞ。」
#include<stdio.h>
#define f(a) a=a+1
int main(void){
int hairetu[3];
hairetu[0]=1;
hairetu[1]=2;
hairetu[2]=3;
printf("%d\n",hairetu[0]);
printf("%d\n",hairetu[1]);
printf("%d\n",hairetu[2]);
printf("%d\n",f(hairetu[0]));
printf("%d\n",f(hairetu[1]));
printf("%d\n",f(hairetu[2]));
printf("%d\n",hairetu[0]);
printf("%d\n",hairetu[1]);
printf("%d\n",hairetu[2]);
return 0;
}
コンパイル結果
1
2
3
2
3
4
2
3
4
ソーラー「このプログラムのポイントは
printf文の塊が3つあるところだね。
printf("%d\n",hairetu[0]);
printf("%d\n",hairetu[1]);
printf("%d\n",hairetu[2]);
printf("%d\n",f(hairetu[0]));
printf("%d\n",f(hairetu[1]));
printf("%d\n",f(hairetu[2]));
printf("%d\n",hairetu[0]);
printf("%d\n",hairetu[1]);
printf("%d\n",hairetu[2]);
」
アレサ「
printf("%d\n",hairetu[0]);
printf("%d\n",hairetu[1]);
printf("%d\n",hairetu[2]);
は
最初の3つのprintf文
printf("%d\n",f(hairetu[0]));
printf("%d\n",f(hairetu[1]));
printf("%d\n",f(hairetu[2]));
は
真ん中の3つのprintf文
printf("%d\n",hairetu[0]);
printf("%d\n",hairetu[1]);
printf("%d\n",hairetu[2]);
は
最後の3つのprintf文と
分類しておきますの。」
ソーラー
「プログラムをfor文を使って簡略化すると😝
#include<stdio.h>
#define f(a) a=a+1
int main(void){
int hairetu[3];
hairetu[0]=1;
hairetu[1]=2;
hairetu[2]=3;
int h;
for(h=0;h<3;h++)
printf("%d\n",hairetu[h]);
int i;
for(i=0;i<3;i++)
printf("%d\n",f(hairetu[i]));
int j;
for(j=0;j<3;j++)
printf("%d\n",hairetu[j]);
return 0;
}
コンパイル結果
1
2
3
2
3
4
2
3
4
となります。」
ソーラー「なんとも あっさりと
main関数内で定義された配列の
配列変数に格納されている数値に
1を加え変更することができたね。
最初の3つのprintf文
printf("%d\n",hairetu[0]);
printf("%d\n",hairetu[1]);
printf("%d\n",hairetu[2]);
の
コンパイル結果をみてもわかるように
この時点では
配列変数
hairetu[0]
hairetu[1]
hairetu[2]
に格納されている数値は
1
2
3
ですね。
その次の
真ん中の3つのprintf文
printf("%d\n",f(hairetu[0]));
printf("%d\n",f(hairetu[1]));
printf("%d\n",f(hairetu[2]));
において
f(hairetu[0])
f(hairetu[1])
f(hairetu[2])
は
マクロの定義
#define f(a) a=a+1
より
hairetu[0]=hairetu[0]+1
hairetu[1]=hairetu[1]+1
hairetu[2]=hairetu[2]+1
とみなされるので
printf("%d\n",f(hairetu[0]));
printf("%d\n",f(hairetu[1]));
printf("%d\n",f(hairetu[2]));
は
次の命令文
printf("%d\n",hairetu[0]=hairetu[0]+1);
printf("%d\n",hairetu[1]=hairetu[1]+1);
printf("%d\n",hairetu[2]=hairetu[2]+1);
と等しくなります
さて
あとは
printf("%d\n",hairetu[0]=hairetu[0]+1);
printf("%d\n",hairetu[1]=hairetu[1]+1);
printf("%d\n",hairetu[2]=hairetu[2]+1);
このプログラムが実行されると
どのような結果が表示されるかということですね。
基本的に
printf("%d\n",hairetu[0]=hairetu[0]+1);
printf("%d\n",hairetu[1]=hairetu[1]+1);
printf("%d\n",hairetu[2]=hairetu[2]+1);
と記述されると
printf("%d\n",hairetu[0]);
printf("%d\n",hairetu[1]);
printf("%d\n",hairetu[2]);
が実行されるのですが
hairetu[0]にhairetu[0]+1
hairetu[1]にhairetu[1]+1
hairetu[2]にhairetu[2]+1
が代入されるので
最終的には
printf("%d\n",hairetu[0]=hairetu[0]+1);
printf("%d\n",hairetu[1]=hairetu[1]+1);
printf("%d\n",hairetu[2]=hairetu[2]+1);
は
printf("%d\n",hairetu[0]+1);
printf("%d\n",hairetu[1]+1);
printf("%d\n",hairetu[2]+1);
が実行されることとなります
そうなると
コンパイル結果は
2
3
4
となります
ところで
真ん中の3つのprintf文
printf("%d\n",f(hairetu[0]));
printf("%d\n",f(hairetu[1]));
printf("%d\n",f(hairetu[2]));
で
f(hairetu[0])
f(hairetu[1])
f(hairetu[2])
が記述されていますね
すると
マクロの定義
#define f(a) a=a+1
(この a=a+1と記述してあるのがポイントなのです)
より
f(hairetu[0])
f(hairetu[1])
f(hairetu[2])
は
f(hairetu[0]=hairetu[0]+1)
f(hairetu[1]=hairetu[1]+1)
f(hairetu[2]=hairetu[2]+1)
となりますが
このとき
hairetu[0]=hairetu[0]+1
hairetu[1]=hairetu[1]+1
hairetu[2]=hairetu[2]+1
が
同時に実行されることになるので
この真ん中の3つの命令文
printf("%d\n",f(hairetu[0]));
printf("%d\n",f(hairetu[1]));
printf("%d\n",f(hairetu[2]));
が実行された時点で
配列変数
hairetu[0]
hairetu[1]
hairetu[2]
に格納されている数値は
hairetu[0]=hairetu[0]+1
hairetu[1]=hairetu[1]+1
hairetu[2]=hairetu[2]+1
により
2
3
4
に変化しています。
そのことは
hairetu[0]
hairetu[1]
hairetu[2]
に格納されている数値の値をprintf出力表示する
プログラムの中の最後の
3つのprintf文
printf("%d\n",hairetu[0]);
printf("%d\n",hairetu[1]);
printf("%d\n",hairetu[2]);
を実行したあとの
コンパイル結果をみてわかります
コンパイル結果は
2
3
4
となっていますね。
どうかな アレサ
main関数内で定義された配列の配列変数
hairetu[0]
hairetu[1]
hairetu[2]
に格納された数値が
マクロの定義
#define f(a) a=a+1
により
1
2
3
から
2
3
4
に
簡単に変更されているね。
ポインタ変数を使う場合と比べて
かなり簡単になってるね。
まさに
天国だね」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます