(C言語)関数形式マクロ

( 子の本棚にC言語入門の本が落ちてたので、勉強してみよっと )

 

【 実行プログラム 】

実行プログラム

【 ソースプログラム 】

#include  <stdio.h>

#define sqr(x) *1

int main(void)
{
    int nx;
    double dx;

    printf("整数を入力ください:");
    scanf("%d", &nx);
    printf("その数の二乗は%d\n", sqr(nx));

    printf("実数を入力ください:");
    scanf("%lf", &dx);
    printf("その数の二乗は%f\n", sqr(dx));

    return (0);
}

 

【 まなび 】

■ 通常の関数を利用した場合は・・・

int sqr_int(int x)
{
    return (x * x);
}

double sqr_double(double x)
{
    return (x * x);
}

のように、型ごとの使い分けが必要となってしまう。

それを避けることができる方法として、関数形式マクロの利用がある。

 

■ ()で囲んでおくと安心

#define sqr(x) x * x

でも本件では動作するが・・・

例えば、xがa + bであるような場合には、

a + b × a + b

と置換されるので、b × a が先に実行されてしまう。

このような事故を予防する意味で、

 
#define sqr(x) *2

のように()を付けておくことが理想的である。

 

■ 副作用には注意が必要

例えば、sqr(a++)だと、((a++)*(a++))となり、

後半のa++は、前半のa++でインクリメントされた状態となってしまう。

 

************************************************
【 演習8-1 】

二つの値xとyの差を求める関数形式マクロを定義せよ。

 diff(x, y)

 

演習8-1

 

#include  <stdio.h>

#define diff(x, y) *3

int main(void)
{
    int x, y;

    printf("1つ目の整数を入力せよ:");
    scanf("%d", &x);

    printf("2つ目の整数を入力せよ:");
    scanf("%d", &y);

    printf("その数の差は%d\n", diff(x, y));

    return (0);
}

 

 

*1:x) * (x

*2:x) * (x

*3:x) - (y) > 0 ? (x) - (y) : (y) - (x