2
#include<stdio.h>
#include<conio.h>
#define ABC 20
#define XYZ 10
#define XXX ABC - XYZ

void main()
{
    int     a;

    a = XXX * 10;

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

    getch();
}

出力は100になると思いましたが、結果を見ると-80でした。角かっこを付けた場合#define XXX (ABC-XYZ)、出力は100になりますが、角かっこを付けないと、出力は-80になります。

4

4 に答える 4

13

プリプロセッサはばかげた獣です。これは、意味的にコードに対して何を行っているかに関係なく、純粋にテキストレベルで機能します。この場合の動作を見てみましょう。

a = XXX * 10;

になります

a = ABC - XYZ * 10;

これは

a = 20 - 10 * 10;

これは明らかに-80です。

おそらく意図されていたのは

#define XXX (ABC - XYZ)

これが、マクロが悪と見なされる理由の1つです。

于 2010-03-22T11:07:48.890 に答える
3
a = XXX * 10;

コンパイル前に次のように変更されます。

a = 20 - 10 * 10;

これはに評価されます-80

于 2010-03-22T11:07:26.370 に答える
2

このように計算しています、

20-10 * 10

マクロXXXで中括弧を使用します。

#define XXX (ABC-XYZ)
于 2010-03-22T11:10:19.103 に答える
2

ここでXXXはABC-XYZに置き換えられているので、次のようになります

20-10 * 10

したがって、出力は-80です。

于 2010-03-22T11:17:14.350 に答える