#include <stdio.h>
double IncomeTAX(double i)
{
double tax;
if(i <= 120000)
tax = 0;
else
tax = (i - 120000) * 15/100;
return tax;
}
int main(void)
{
double a, b;
printf ("Enter the annual income: ");
scanf ("%lf", &b);
a = IncomeTAX(b);
printf ("Income Tax is %.2lf\n", a);
}
当我尝试以这种方式运行程序时,它可以工作,但是当我分离程序时,程序会编译但会给出垃圾值。但是,如果我将过程中的数据类型从“double”更改为“long”,即使该过程是单独编译的,程序也能正常工作。
谁能告诉我这背后的原因是什么?
答案 0 :(得分:5)
如果通过“将程序分开”,则意味着“将IncomeTAX()函数放在不同的源代码文件中”,或许您在使用前未能声明它。把它放在main()
:
extern double IncomeTAX(double);
通常情况下,这将存在于头文件IncomeTAX.h
中。
您需要此声明的原因是否则C将默认使用int
;这会导致问题,因为它可能与double
不同。
答案 1 :(得分:3)
在没有原型的情况下,编译器会尝试提供帮助,并猜测正确类型的返回值和函数参数。
有时它会猜错(特别是当类型不是int
时)。
解决方案:如果要分离函数,请始终将原型用于函数并创建头文件。
答案 2 :(得分:2)
声明和自动输入。如果在使用之前未声明该过程,则假定它是整数类型。将它们放在同一个文件中会增加定义作为声明的效果。如果您只是将主文件中的过程声明为返回一个double,当您将它们分开时,它也会起作用。
FWIW,有一些诗意的关于IncomeTax函数返回 double ......
#include <stdio.h>
double IncomeTAX(double i);
int main(void)
{
double a, b;
printf ("Enter the annual income: ");
scanf ("%lf", &b);
a = IncomeTAX(b);
printf ("Income Tax is %.2lf\n", a);
}
答案 3 :(得分:0)
我假设通过“分离程序”,你的意思是将程序移到一个单独的文件中。
在这种情况下,问题可能是因为您在使用之前没有声明您的程序。如果您没有声明您的过程,编译器将假定所有参数都是int
类型。
您需要做的是在调用之前的某个地方声明您的程序。
double IncomeTAX(double i);
通常的惯例是将其添加到头文件中;例如,如果您在IncomeTAX()
中定义了tax.c
过程,则会在tax.h
中声明,然后在包含main()
的文件中,您会添加:
#include "tax.h"
答案 4 :(得分:-1)
你有15/100的地方是错误的。这两个数字是整数,因此返回一个整数,0。替换为0.15 / 0.15f。