用C中的宏计算浮点数

时间:2016-11-29 07:33:50

标签: c c-preprocessor

我的同事和我正在学习测试,我们必须分析C代码。通过前几年的测试,我们看到了以下代码,我们并不理解:

#include <stdio.h>
#define SUM(a,b) a + b
#define HALF(a)  a / 2

int main(int argc, char *argv[])
{
  int big = 6;
  float small = 3.0;

  printf("The average is %d\n", HALF(SUM(big, small)));
  return 0;
}

此代码打印0,我们根本不理解......你能解释一下吗?

提前非常感谢!

2 个答案:

答案 0 :(得分:3)

编译器的警告(format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘double’)提供的信息足够多。您需要更正format-specifier,而不是%lf,而不是%d,因为您正在尝试打印double值。

  printf("The average is %lf\n", HALF(SUM(big, small)));
无论你告诉它,

printf都会将你指向的记忆对待。在这里,它将表示float的内存视为int。因为两者的存储方式不同,所以你应该得到一个基本上是随机数的东西。它不一定是0

答案 1 :(得分:0)

获得正确的输出

  1. 在宏中添加括号
  2. 使用正确的格式说明符(%f
  3. 更正代码

    #include <stdio.h>
    
    #define SUM(a, b) (a + b)
    #define HALF(a)  a / 2
    
    int main() {
        int big = 6;
        float small = 3.0;
        printf("The average is %f\n", HALF(SUM(big, small)));
        return 0;
    }
    

    输出

    The average is 4.500000
    

    如果您不添加括号,由于运算符优先级,输出将为7.500000

    如果您需要整数输出,请在打印前强制转换为int

    printf("The average is %d\n", (int)HALF(SUM(big, small)));
    

    输出

    The average is 4