マクロで定義された自作関数を使って お手軽に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


簡単に変更されているね。


ポインタ変数を使う場合と比べて

かなり簡単になってるね。


まさに

天国だね」



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

作者を応援しよう!

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

応援したユーザー

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