函数初体验
请按顺序标示出指定语句的执行顺序(如 A -> B -> C -> D)
#include <stdio.h>
void a();
void b();
void c();
void a()
{
; // A
}
int main()
{
b(); // B
a(); // C
c(); // D
return 0;
}
void c()
{
; // E
}
void b()
{
; // F
}
答:B -> F -> C -> A -> D -> E
注:什么都没有只写一个分号(;)表示这是一个空语句,什么也不做。
#include <stdio.h>
void func()
int main()
{
func();
return O;
}
void func()
{
print("I love FishC.com!\n");
return 0;
};
#include <stdio.h>
void func(); // A. 声明语句需要分号结束
int main()
{
func();
return O; // B. 返回数字0不是字母0
}
void func()
{
print("I love FishC.com!\n"); // C. 格式化输出的标准库函数是printf
return 0; // D. 返回值是void的函数不需要使用return语句返回
} // E. 这里不应该加分号
函数的声明有什么用?
答:所谓声明(Declaration),就是告诉编译器我要使用这个函数,你现在没有找到它的定义不要紧,请不要报错,稍后我会把定义补上。
有时候,你可能会发现及时不写函数的声明,程序也是可以正常执行的。但如果你把函数的定义写在调用之后,那么编译器可能就会找不着北了:
#include <stdio.h>
int main()
{
print_C();
return 0;
}
void print_C()
{
printf(" ###### \n");
printf("## ##\n");
printf("## \n");
printf("## \n");
printf("## \n");
printf("## ##\n");
printf(" ###### \n");
}
程序执行后会弹出提醒(一些比较旧的编译器甚至会报错):
这是因为程序的编译时从上到下执行的,所以从原则上来说,函数必须“先定义,再调用”。向上边例子反其道而行就会出问题。但在实际开发中,经常会在函数定义之前使用它们,这个时候就需要提前声明。
函数是否必须声明才能使用?
答:对于函数来说,必须“先定义,再调用”。但声明却不是必须的,只要“被调用函数”的定义在“调用函数”之前即可。但是,作为一个良好的编程习惯,建议大家还是无论如何都把函数的声明写上比较合适。
如果定义一个与标准库函数重名的函数,会这样?答:重新定义的同名函数会覆盖标准库函数(前提是两者的声明一致,包括返回值和参数类型、个数一致)。
比如下面我们把 putchar 函数给覆盖掉:
#include <stdio.h>
int putchar(int c);
int putchar(int c)
{
printf("FishC\n");
return c;
}
int main(void)
{
putchar('H');
return 0;
}
程序实现如下: