【发布时间】:2018-08-28 17:51:20
【问题描述】:
在制作函数atof时,我将整个工作分成两个独立的翻译单元:
m.c
#include<stdio.h>
extern fun(char[]); //return type not mentioned on purpose
int main()
{
printf("%d\n",fun("+123.980")); //%f would also display 0.000000
return 0;
}
n.c
#include<ctype.h>
float fun(char c[])
{
float val=0, pow=1;
int i;
int sign;
for(i=0;isspace(c[i]);i++); //SKIPPING WHITESPACE IF ANY
if(c[i]=='+')
sign = 1;
if(c[i]=='-')
sign =-1;
++i;
for(;c[i]!='.';i++)
val = val*10 + (c[i]-'0');
++i;
while(isdigit(c[i]))
{
val = val*10 + (c[i]-'0');
pow=pow*10;
++i;
}
return sign*val/pow;
}
警告说,在这种情况下,函数的类型将默认为int,因为全局空间中没有明确提及任何返回类型的每个变量/函数类型都默认为 int。
我希望输出是 +123.980 的 int 版本,即只有 123。
但相反,它显示 0(否则函数工作正常)。为什么?
【问题讨论】:
-
如果声明的类型与定义的类型不匹配,则为未定义行为。
-
返回类型被隐式采用
int并不意味着您可以期望您的float被转换 为int。这意味着调用者将假定它已经是一个int。如果实际情况并非如此,则语言不会指定会发生什么。 -
它默认为类型的事实并不重要。如果您明确输入
int返回类型,也会发生同样的事情。它仍然与函数返回的实际类型不匹配,因此它是未定义的行为。 -
此外,现代 C 不再具有任何级别的隐式类型。接受它的编译器这样做只是为了向后兼容。不要编写依赖它的代码。
标签: c