在处理项目时,我偶然发现了一个问题。使用预处理器定义值的某些算法导致0.00
。
#include <stdio.h>
#define PINGCOUNT 10
int main()
{
int successful = 5;
int lossPercentage = ((PINGCOUNT - successful) / PINGCOUNT) * 100;
printf("%.2lf\n", lossPercentage);
return 0;
}
我在在线编译器中重新运行此代码并获得相同的结果。我不确定我的措辞是否很差,但我无法在线查找有关此主题的信息。
如果我首先声明int count = PINGCOUNT
,然后将PINGCOUNT
实例替换为count
,则上述代码将起作用。另外,我尝试在一些简单的减法/加法中使用PINGCOUNT
并且它正常工作。有什么明显的东西我不见了吗?
答案 0 :(得分:3)
由于您的计划中的所有内容都是int
,因此您需要进行整数除法,因此(PINGCOUNT - successful) / PINGCOUNT
等于0
,乘以100
仍为0
{1}}。
然后,您尝试将结果打印为double
,这会调用未定义的行为。
更改此行
int lossPercentage = ((PINGCOUNT - successful) / PINGCOUNT) * 100;
为:
double lossPercentage = (PINGCOUNT - successful) * 100.0 / PINGCOUNT;
确保结果为double
类型,按预期执行操作。
答案 1 :(得分:0)
尝试: int lossPercentage =(PINGCOUNT - 成功)* 100 / PINGCOUNT;
这只是整数问题, (PINGCOUNT - 成功)/ PINGCOUNT) 等于0且* 100仍为0
答案 2 :(得分:0)
可以将预处理器值用于C?
中的算术运算
是
但为什么你不应该使用宏?
因为他们之前重新排列了程序文本 编译器正确地看到它,宏也是许多编程支持工具的主要问题。 (礼貌:Bjane Stroustrup)
虽然他说从C ++的角度来看,它同样如此 也适用于C程序。
现在您的计划中发生了什么
您获得意外结果不是因为您使用了预处理器 计算中的值。这是因为你使用了一种不能的类型 存储浮点值,即 int 。
你实际上可以改变
int lossPercentage = ((PINGCOUNT - successful) / PINGCOUNT) * 100;
到
double lossPercentage = ((PINGCOUNT - successful) / PINGCOUNT) * 100;
另一种方法是在预处理器定义中使用C-Style强制转换。
更改
#define PINGCOUNT 10
到
#define PINGCOUNT ((float)10)
并保留
int lossPercentage = ((PINGCOUNT - successful) / PINGCOUNT) * 100;
但是你在这里失去了精确度并且与C-Style Cast相关的成本 - 问题只能是 在运行时发现。请参阅此SO question。