如果用宏vs局部变量执行除法运算,为什么结果会有所不同?

时间:2019-05-04 15:55:40

标签: c gcc

我一直在研究C代码。我已经使用#define声明了几个常量。但是我观察到,当我用常量(使用#define定义)对局部变量进行除法时,在数值上得到了错误的答案。

我尝试将定义的常量(使用#define)更改为局部变量,然后执行除法。现在我得到正确的答案。

问题是我有很多常数,其值将在各种函数中使用。我想知道如何解决这个问题。

这些是我在使用#define时得到的结果 “ 0.106883是q2,11.575652是D2,0.000004是q2 / D2”

这些是我用作局部变量时得到的结果。 “ 0.106883是q2,11.575652是D2,0.009233是q2 / D2”

我正在使用GCC 8.3.0_2。这是我的问题的简单版本。

#include <stdio.h>
#include<stdlib.h>
#define D2 (h2()*2)/(50)
double h2(void);

int main(){
 double q2 = 0.106883;
 printf("%f is q2, %f is D2 ,%f is q2/D2\n",q2,D2,q2/D2);

}
double h2(void){
 return(289.391293);
}

1 个答案:

答案 0 :(得分:2)

使用#define,您的表达式实际上是q2/(h2()*2)/50,而不是q2/((h2()*2)/50)。您需要将#define括在括号中,即#define D2 ((h2()*2)/50)

宏基本上只是文本替换。另一个例子:

#define a 1+2
int b = 3*a   // 3*1+2 = 5
int c = 3*(a) // 3*(1+2) = 9