在创建函数时atof,我将整个工作分成两个单独的转换单元:
MC
#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;
}
Run Code Online (Sandbox Code Playgroud)
NC
#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;
}
Run Code Online (Sandbox Code Playgroud)
警告说int在这种情况下函数的类型将默认为,因为全局空间中的每个变量/函数类型都没有明确提到任何返回类型,默认为int.
我期待输出int版本为+123.980,即仅123.但相反它显示0(否则功能正常).为什么?
从C语言int中删除了隐式和隐式函数声明.他们已经不复存在了.该计划格式不正确.如果您的编译器接受它,那么您正在处理供应商扩展 - 或者是C的过时版本的编译器.
在删除这些内容之前,该程序具有未定义的行为.该标准的所有版本都要求程序中实体的所有声明必须兼容,无论它们中的任何内容是否隐含.违反此规则会导致未定义的行为,无需诊断.