1 2 4 结果是为何不同?


#define CANBERRA(x,y)((x-y)/(x+y))
int main(void){
/*CANBERRA(3.0,2.0)
CANBERRA(4.0,1.0)
CANBERRA(1.0+2.0,0.0+2.0)
CANBERRA(1.0+2.0,1.0+1.0)*/
float a= CANBERRA(1.0+2.0,1.0+1.0);
float b=CANBERRA(1.0+2.0,0.0+2.0);
float c=CANBERRA(4.0,1.0);
float d=CANBERRA(3.0,2.0);
    printf("%f %f %f %f %f\n", a,b,c,d);
return 0; }

img

宏函数的参数是原地展开的
CANBERRA(1.0+2.0,1.0+1.0) = (1.0+2.0-1.0+1.0) / (1.0+2.0+1.0+1.0) = 3 / 5 = 0.6
同理可得第二种情况

譬如你这里面的a 他传进去后 做的操作 ((1.0+2.0-1.0+1.0)/(1.0+2.0+1.0+1.0)) 它是不会你整体传进来就给你先做 我不知道我这么说你能不能理解