我的同事和我正在学习测试,我们必须分析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,我们根本不理解......你能解释一下吗?
提前非常感谢!
答案 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)
获得正确的输出
%f
)更正代码
#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