C语言成长之路40:函数精讲(上)
声明:本笔记基于 B站UP主「来自程序员的暴击」的 「C语言成长之路」中对应课程;
C语言中,代码的执行顺序一般都是以从上到下的方式进行执行,所以一般建议main函数放在代码的最底部;
但是有一个方法,可以声明函数,先告知编译器你有这么一个函数的存在,后面再补上函数的具体实例;
一般例子(main函数在最后):
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <limits.h> 4 #include <Windows.h> 5 6 //#pragma comment(linker,"/subsystem:\"windows\" /entry:\"mainCRTStartup\"") 7 8 void add(int a, int b){ 9 int c = a + b; 10 printf("a + b = %d\n",c); 11 } 12 13 int main(){ 14 /* C语言成长之路40:函数精讲(上) 15 * 16 */ 17 add(1,2); 18 return 0; 19 }
先声明函数,再补全函数定义:
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <limits.h> 4 #include <Windows.h> 5 6 //#pragma comment(linker,"/subsystem:\"windows\" /entry:\"mainCRTStartup\"") 7 8 void add(); // 先声明有一个void类型的函数,这里指向18行的void函数 9 10 int main(){ 11 /* C语言成长之路40:函数精讲(上) 12 * 13 */ 14 add(1,2); 15 return 0; 16 } 17 18 void add(int a, int b){ // 再在后面补全函数的具体执行代码 19 int c = a + b; 20 printf("a + b = %d\n",c); 21 }
跨文件调用函数:
编写一个头文件akne.h,在akne中写一个akne的函数打印Hello
回到main.c中,引入akne.h后,就能正常的使用akne.h里面的函数了;
#include <stdio.h> #include "akne.h" // 引入akne.h头文件 void add(int a, int b){ int c = a + b; printf("a + b = %d\n",c); } int main(){ /* C语言成长之路40:函数精讲(上) * */ add(1,2); akne(); // 因为前面正常的引入了akne这个头文件,所以就可以正常的使用这个函数了s return 0; }
函数的定义
函数就是对某一特定功能的抽象
函数的作用
模块化,便于定位错误
函数定义的语法格式
函数定义有4个要素:参数列表,返回类型,函数名和函数体,参数列表和返回类型;
函数名用于和程序中其他程序实体区分,而函数体可以是一段可执行的代码块,实现特定的算法或功能。
调用函数的两种方式:
1、“先定义,后调用”
这要求函数定义和调用语句在同一个文件内,编译器才能从函数定义中提取函数的参数列表、输出类型等接口信息。
举例:函数声明和调用再一个文件内;
2、“函数生命+函数调用”
大多数情况下,函数的定义与函数的调用并不在一个文件内,即使在一个文件中也有可能调用在前而定义在后,这个时候需要在调用之前先对函数声明,告诉编译器有这个一个函数的存在;
举例:函数的跨文件调用;
注意事项:
1、函数的定义在程序中都是平行的,即不允许在一个函数的内部调用另外一个函数;
2、函数名是用户自定义标识符,当函数值为整型时类型名可以省略;当函数不需要向调用方返回值时候,使用void类型名;
3、形参列表中的形参是用户自定义标识符,没有参数时,圆括号不能省略,此时函数为无参函数;
4、函数在没有声明的时候必须写在main函数之前,否则会出错;