可以将预处理器值用于C中的算术运算吗?

时间:2015-11-21 11:53:46

标签: c c-preprocessor

在处理项目时,我偶然发现了一个问题。使用预处理器定义值的某些算法导致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并且它正常工作。有什么明显的东西我不见了吗?

3 个答案:

答案 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