2

コードは次のとおりです。

#include <stdio.h>
#include <stdio.h>
#define VAL1(a,b)    a*b
#define VAL2(a,b)    a/b
#define VAL3(a,b)    ++a%b
int main()
{
    int a = 1;
    int b = 2;
    int c = 3;
    int d = 3;
    int e = 5;

    int result = VAL2(a,d)/VAL1(e,b)+VAL3(c,d);  // result = 1
    //int result = a/d/e*b+++c%d;                // result = 0

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

    return 0;
}

2 つのステートメントの結果が同じにならないのはなぜですか?

4

3 に答える 3

7

ある場合には が+ ++あり、別の場合には があります++ ++ ++++ +トークンの異なるストリームです。貼り付けられるのはトークンであるため、マクロの貼り付けはトークン化を変更しません。

プログラムを C プリプロセッサに打ち込むと、その行で次のようになります。

int result = a/d/e*b+ ++c%d;

+トークンとトークンの間にスペースが必須であるため、プリプロセッサがスペースを挿入する必要があることに注意してください++

于 2013-03-11T11:16:38.797 に答える
0

GCC 4.7でコンパイルしようとしましたが、2つの式で同じ結果が得られました。

マクロがどのように展開されるかを確認したい場合cppは、C Preprossessorであるを使用できます。これにより、プリプロセッサ式が実行された後の出力が得られます。ここでの出力は次のとおりです。

int main()
{
    int a = 1;
    int b = 2;
    int c = 3;
    int d = 3;
    int e = 5;

    int result = a/d/e*b+++c%d;  
    int result2 = a/d/e*b+++c%d;  

    printf("%d %d\n", result, result2);

    return 0;
}
于 2013-03-11T11:19:31.790 に答える
-1

このようなマクロを使用する必要があると本当に思われる場合は、()副作用を回避するために括弧を使用する必要があります。

#define VAL1(a,b)    ((a)*(b))
#define VAL2(a,b)    ((a)/(b))
#define VAL3(a,b)    ((++a)%(b))
于 2013-03-11T11:17:31.643 に答える