C 在标题中由#define isn';t由代码设置

C 在标题中由#define isn';t由代码设置,c,c-preprocessor,C,C Preprocessor,我编写了一个非常简单的代码,用于计算函数的值: #定义最小值0.00001 #定义最大值1 #定义maxp10000 双功能日志(双x) { 双r=RPWN; printf(“MAXP=%e\n”,MAXP); printf(“MIN=%e\n”,MIN); printf(“MAX=%e\n”,MAX); 双y; 如果(x>r | | x==0)返回(0.0); 否则{ y=r+((r*r)/(2.*x)-x/2。)*log((1+r/x)/(r/x-1)); } 返回y; } 该函数位于与

我编写了一个非常简单的代码,用于计算函数的值:

#定义最小值0.00001
#定义最大值1
#定义maxp10000
双功能日志(双x)
{
双r=RPWN;
printf(“MAXP=%e\n”,MAXP);
printf(“MIN=%e\n”,MIN);
printf(“MAX=%e\n”,MAX);
双y;
如果(x>r | | x==0)返回(0.0);
否则{
y=r+((r*r)/(2.*x)-x/2。)*log((1+r/x)/(r/x-1));
}
返回y;
}
该函数位于与其他源文件一起编译的.c文件中。问题是不能将
MAXP
设置为其值。以下是当我要求打印
MIN
MAXP
MAXP
的值时得到的结果:

MAXP=4.940656e-324
最小值=1.000000e-05
最大值=1.000000 E+00

我真的不明白为什么我得到
4.940656e-324
MAXP
,我从来没有这样的问题。另外,当我编写
#定义MAXP 10000.
时,我会得到
MAXP=1.000000e+04
。我用gcc编译,有人有什么线索吗?

问题是
%e
打印浮点型和双精度型,但打印的是MAXP和MAX-type整数


您可以使用
%d
打印整数。

问题是
%e
打印浮点型和双精度型,但您的MAXP和MAX-type整数


您可以使用
%d
打印整数。

问题不在于
MAXP
的值,而在于用于打印它的格式说明符
%e

MAXP
不是变量,而是宏。因此,它没有与之关联的类型。编译器从上下文中计算出
1000
的类型,在
printf
的情况下,这意味着
int
(默认解释为
1000
)。在不同的上下文中,
1000
可以被解释为
浮点
双精度
,例如
float f=MAXP
需要记住的一件重要事情是,在代码体中,
MAXP
以文本形式替换为
1000

如果希望默认情况下将
MAXP
解释为双精度,请在末尾添加
.0

#define MAXP 10000.0
如果希望它保持整数文字,请使用
%d
打印它

printf(" MAXP = %d  \n", MAXP);
或添加显式强制转换:

printf(" MAXP = %e  \n", (double)MAXP);

问题不在于
MAXP
的值,而在于用于打印它的格式说明符
%e

MAXP
不是变量,而是宏。因此,它没有与之关联的类型。编译器从上下文中计算出
1000
的类型,在
printf
的情况下,这意味着
int
(默认解释为
1000
)。在不同的上下文中,
1000
可以被解释为
浮点
双精度
,例如
float f=MAXP
需要记住的一件重要事情是,在代码体中,
MAXP
以文本形式替换为
1000

如果希望默认情况下将
MAXP
解释为双精度,请在末尾添加
.0

#define MAXP 10000.0
如果希望它保持整数文字,请使用
%d
打印它

printf(" MAXP = %d  \n", MAXP);
或添加显式强制转换:

printf(" MAXP = %e  \n", (double)MAXP);

MAX和MAXP是打印为双精度的整数常量。幸福不是选择之一。向定义中添加小数点。启用编译器警告。投票以简单的打字错误结束此操作。@Lundin不一定是打字错误,问题是可以的。对于初学者来说,这种行为实际上看起来strange@MichaelWalz好吧,那就跟我一样接近。@Lundin离我还不够近。OP可能无法理解Max和MAXP是打印为双精度的整数常量。幸福不是选择之一。向定义中添加小数点。启用编译器警告。投票以简单的打字错误结束此操作。@Lundin不一定是打字错误,问题是可以的。对于初学者来说,这种行为实际上看起来strange@MichaelWalz好吧,那就跟我一样接近。@Lundin离我还不够近。OP可能不会理解事实上,你甚至不需要结尾处的
0
(以防程序员误认为它是一个重要数字),你只需要小数点或指数部分。事实上,你甚至不需要结尾处的
0
(如果程序员可能会将其误认为一个重要数字),您只需要小数点或指数部分。