マクロによって作られた自作関数の特徴を考察してみましょう。

アレサ「ソーラーさん 先程のプログラムを


振り返ってみます」


ソーラー「そうだね。」



#include<stdio.h>


#define f(a) a+1


int main(void){


printf("%d\n",f(1));


return 0;

}


コンパイル結果

2


#include<stdio.h>


#define f(a) a+1


int main(void){


printf("%f\n",f(1.0));


return 0;

}


コンパイル結果

2.000000




アレサ「さきのエピソードでも見てきたように


#define f(a) a+1 


と f(a)をa+1とみなすマクロの定義において


aは変数宣言されていないのですが


整数値や実数値を代入することができます


面白い設定になっていますね


それでは次のプログラムの


コンパイル結果はどうなるでしょうか?」


#include<stdio.h>


#define f(a) a+1


int main(void){


printf("%d\n",f(1));

printf("%d\n",a);


return 0;

}


アレサ

printf("%d\n",f(1));

のあとに

printf("%d\n",a);が記述されています


f(a)にf(1)とaに1が代入することができているなら


printf("%d\n",a);


のコンパイル結果は1となるのでしょうか?


どう思われますか ソーラーさん?」


ソーラー「みなさん、 僕がソーラーです(*´▽`*)


よろしくお願いします


さあ 皆さんはどうおもわれますか?」








printf("%d\n",a);


ですか?


幸せですか?






今のプログラムでは


#define f(a) a+1


で定義された


自作関数f(a)のaに1を代入しています


ローカル変数の時と同じように


自作関数で定義されたaと


main関数内で定義された変数aは


違う変数となるんじゃない?


だから今のプログラムでは


main関数内で変数aは定義されていないので


printf("%d\n",a);


のaは定義されていません、と


コンパイルエラーが出るんじゃないかな?」


アレサ「うう・・・・まともな考察です。


そう来られるとは予想していませんでした。


では


実際にプログラムをコンパイルしてみます。


#include<stdio.h>


#define f(a) a+1


int main(void){


printf("%d\n",f(1));

printf("%d\n",a);


return 0;

}


コンパイル結果


ファイル「C:/Users/solarplexuss/AppData/Local/EasyIDEC/project/ www/main.c」の

「8行目」で記述エラーを発見しました。

「a」が定義されていません。

名前が間違っていないかどうか確認してください。



アレサ「ん~んん ソーラーさん お見事正解です」


ソーラー「えへへー 正解するとはね」


アレサ「では


次のプログラムはコンパイル結果はどうなるでしょうか?


#include<stdio.h>


#define f(a) a+1


int main(void){

int a=2;

printf("%d\n",f(1));

printf("%d\n",a);


return 0;

}


ソーラー「今度はmain関数内でaが


int a=2;

変数宣言、2を代入されて初期化されてるね。


だから


printf("%d\n",a);

のコンパイル結果は2だね。


int a=2;のあとに


printf("%d\n",f(1));


f(a)の

aに1が代入されているからと言って


printf("%d\n",a);


のコンパイル結果は1にはならないと思うんだ


だって


同じaでも


自作関数で定義されたaと


main関数内で定義された変数aは


違うものとしてあつかわれますからね


自作関数のaに1を代入したからといって


main関数内で定義された変数aに1が代入されたことにはならない


だから

main関数内で

int a=2;

と定義された変数aに格納された数値は


a=2のまま 変化せず


printf("%d\n",a);


のコンパイル結果は2になるんじゃないかな?」


アレサ「・・・・・・正解ですの


今のプログラムをコンパイルしてみます」


#include<stdio.h>


#define f(a) a+1


int main(void){

int a=2;

printf("%d\n",f(1));

printf("%d\n",a);


return 0;

}


コンパイル結果

2

2


アレサ「ソーラーさんの 予想通り


コンパイル結果は2となっています」


ソーラー「やったね🌞」