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;
}

为什么两个语句的结果不一样?

4

3 回答 3

7

在一种情况下你有+ ++,在另一种情况下你有++ ++ ++并且++ +是不同的令牌流。宏粘贴不会更改标记化,因为粘贴的是标记。

如果你将你的程序打入一个 C 预处理器,你会为那一行得到这个:

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

+请注意,预处理器必须插入一个空格,因为在标记和标记之间是强制性的++

于 2013-03-11T11:16:38.797 回答
0

我尝试用 GCC 4.7 编译它,这两个表达式给出了相同的结果。

如果你想看看宏会如何扩展,你可以使用cppC 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 回答