-8
#include<stdio.h>
#define prod(a,b) ((a>b)?a*a:b*b)

int prod1(int a,int b){
       return ((a>b)?a*a:b*b);
}

int main(){
        int p=0,q=-1;
        int p1=0,q1=-1;
        printf("%d ",prod(p1++,q1++));
        printf("%d ",prod1(p++,q++));
        return 0;
}

输出为:1 0

为什么不一样?宏定义与函数定义有何不同,为什么会产生不同的结果?不应该所有2个输出都等于0吗?

4

3 回答 3

3

在宏

#define prod(a,b) ((a>b)?a*a:b*b)

a 和 b 被多次引用。所以

prod(p1++,q1++)

变成

(p1++ > q1++) ? p1++*p1++ : q1++*q2++

请注意,这与调用函数非常不同

prod1(p1++, q1++)

p1增加q1 一次。并且这样做是可以预见的。

于 2013-10-01T21:01:13.057 回答
0

宏的参数ab作为文本复制到宏的扩展主体中,因此prod(p1++,q1++)扩展为((p1++>q1++)?p1++*p1++:q1++*q1++)与函数评估的内容明显不同。

在标准 C 中,如果单个对象在连续序列点之间被多次修改,则它是未定义的,因此宏会导致未定义的行为。

于 2013-10-01T21:02:24.950 回答
0

查找在预处理器完成其工作后编译的代码:

int prod1(int a,int b){
       return ((a>b)?a*a:b*b);
}

int main(){
    int p=0,q=-1;
    int p1=0,q1=-1;
    int p2=0,q2=-1;
    printf("%d ",((p1++>q1++)?p1++*p1++:q1++*q1++));
    printf("%d ",prod1(p++,q++));
    printf("%d ",(p2>q2)?p2*p2:q2*q2);
    return 0;
}
于 2013-10-01T21:03:03.790 回答