C 如果使用宏变量与局部变量进行除法,为什么结果会不同?

C 如果使用宏变量与局部变量进行除法,为什么结果会不同?,c,gcc,C,Gcc,我一直在写一个C代码。我使用#define声明了几个常量。然而,我观察到,当我用一个常数(用#define定义)对一个局部变量进行除法时,我在数值上得到了一个错误的答案 我尝试将定义的常量(使用#define)更改为局部变量,然后执行除法。现在我得到了正确的答案 问题是我有很多常量,它们的值将在各种函数中使用。我想知道我怎样才能解决这个问题 这些是我使用时得到的结果#define “0.106883为q2,11.575652为D2,0.000004为q2/D2” 这些是我作为局部变量使用时得到的

我一直在写一个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.02。这是我问题的简单版本

#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);
}
#包括
#包括
#定义D2(h2()*2)/(50)
双氢(空);
int main(){
双q2=0.106883;
printf(“%f是q2,%f是D2,%f是q2/D2\n”,q2,D2,q2/D2);
}
双氢(空){
回报率(289.391293);
}
使用
#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

让我们看看实际的代码。变量是什么类型的?您是如何确定这些值的?@ScottHunter q2是double,D2是我所说的常量(当声明为局部变量时,我使用了double)。@MatteoItalia实际代码有500行。让我看看是否可以用一个小代码来复制这个错误。@MatteoItalia我附上了一个更简单的问题版本。