0

Cで知っているように、関数評価の実際のパラメーターの受け渡しは、右端から始まり、左に向けられます。パラメータ付きのマクロ定義の場合はどうなりますか?意味を明確にするためにコードを作成しましたが、出力が混乱しました...これがコードです。

#define parsing(a,b) a*b

int parsefun(int a, int b)
{
    return a*b;    
}

int main()
{
    int i=10;
    printf("%d\n",parsing((i++),i));
    i=10;
    printf("%d\n",parsing(i,(i++)));
    i=10;

    printf("%d\n",parsefun((i++),i));
    i=10;
    printf("%d\n",parsefun(i,(i++)));
    system("PAUSE");
    return 0;
}

このコードは、100 100100110を出力します

マクロの出力が関数と同じであることを望みました。しかし、ここで重要なポイントはどこにありますか?

4

1 に答える 1

7

関数の実際のパラメーターの解析は、右端から始まり、左に向けられます

「解析」ではなく「評価」という意味だと思います。しかし、それは真実ではありません。C標準は順序を指定していません。

したがって、関数に対して取得する動作は、C標準では指定されていません。

マクロの出力が関数と同じであることを望みました

マクロ引数は評価されず、単に置換されます。だからあなたはこれで終わります:

int i=10;
printf("%d\n", (i++) * i);
i=10;
printf("%d\n", i * (i++));

その後、この質問で説明されているように、単に未定義の動作が表示されます。これらの構造(++を使用)が未定義の動作であるのはなぜですか?

于 2012-06-24T10:44:53.170 に答える