在 C 中声明函数之前调用函数会发生什么?

在 C 中,如果函数在声明之前被调用,编译器会假定函数的返回类型为 int
例如,下面的程序编译失败。

#include <stdio.h>
int main(void)
{
    // Note that fun() is not declared
    printf("%c\n", fun());
    return 0;
}

char fun()
{
   return 'G';
}

代码编译结果:​​​​​​​

prog.c:在函数'main'中:
prog.c:5:17:警告:函数“fun”的隐式声明 [-Wimplicit-function-declaration]
  printf("%c\n", fun());
                 ^
prog.c:在顶层:
prog.c:9:6:错误:“有趣”的类型冲突
 字符乐趣()
      ^
prog.c:5:17:注意:先前隐含的“fun”声明在这里
  printf("%c\n", fun());

如果上面代码中的函数char fun()是在 main() 和调用语句后面定义的,那么它就不会编译成功。因为编译器默认假定返回类型为“int”。并且在声明时,如果返回类型与 int 不匹配,则编译器将给出错误。

以下程序编译并运行良好,因为函数是在 main() 之前定义的。​​​​​​​

#include <stdio.h>
 
int fun()
{
   return 10;
}
 
int main(void)
{
    // Note the function fun() is declared
    printf("%d\n", fun());
    return 0;
}

输出结果:

10

参数呢?编译器对参数没有任何假设。因此,当函数应用于某些参数时,编译器将无法执行参数类型和数量的编译时检查。这可能会导致问题。例如,以下程序在 GCC 中编译得很好,并产生了垃圾值作为输出。 ​​​​​​​

#include <stdio.h>
int main (void)
{
    printf("%d", sum(10, 5));
    return 0;
}
int sum (int b, int c, int a)
{
    return (a+b+c);
}

编译器假定输入参数也是 int 存在这种误解。如果编译器假定输入参数为 int,则上述程序将无法编译。
总是建议在使用之前声明一个函数,这样我们在程序运行时就不会看到任何意外。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三贝勒文子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值