为什么需要函数
一段代码要在多处反复使用时,复制粘贴会让程序迅速膨胀,改一处还得记得改其他几处。函数把这段代码打包并起个名字,以后想用就喊一声名字,一处修改处处生效,程序也更容易读懂。
定义与调用函数
C 语言函数的写法是「返回值类型 函数名(参数列表)」:
#include <stdio.h>
void say_hello() {
printf("你好,C 语言!\n");
}
int main() {
say_hello(); // 输出:你好,C 语言!
say_hello(); // 再喊一次,再输出一行
return 0;
}
void 表示这个函数不返回任何值。定义好之后,在 main 里写函数名加括号就能调用。
参数与返回值
函数可以接收数据,加工完再把结果交回来:
#include <stdio.h>
int add(int a, int b) {
return a + b;
}
int main() {
int sum = add(3, 5);
printf("3 + 5 = %d\n", sum); // 输出:3 + 5 = 8
printf("10 + 20 = %d\n", add(10, 20)); // 输出:10 + 20 = 30
return 0;
}
括号里的 a、b 叫形参,调用时传入的 3 和 5 叫实参;return 会立刻结束函数并把值送回调用处。还有个常见疑惑:形参是实参的副本,在函数里改 a 并不会影响外面的变量。
函数声明与头文件
C 编译器从上往下读代码,如果函数定义写在调用之后,会直接编译报错:
#include <stdio.h>
int main() {
printf("%d\n", add(1, 2)); // 编译器还没见过 add,报错
return 0;
}
int add(int a, int b) {
return a + b;
}
解决办法是在文件开头加一行函数声明(也叫函数原型),只写返回值类型、函数名和参数类型,结尾带分号:
#include <stdio.h>
int add(int a, int b); // 函数声明,先登记一声
int main() {
printf("%d\n", add(1, 2)); // 输出:3
return 0;
}
int add(int a, int b) {
return a + b;
}
stdio.h 这类头文件里装的就是 printf 等函数的声明,include 它们等于把这些声明抄到文件开头。以后自己写的函数多了,也可以放进自定义头文件统一声明。
局部变量与作用域
函数内部定义的变量只在函数里有效,离开函数就被销毁:
#include <stdio.h>
void counter() {
int n = 0; // 每次调用都重新创建
n = n + 1;
printf("n = %d\n", n);
}
int main() {
counter(); // 输出:n = 1
counter(); // 还是输出 n = 1,上一次的 n 早就没了
return 0;
}
两次调用都输出 1,说明局部变量每次各玩各的。不同函数里用同名变量也不会冲突,这是 C 保持函数之间互不打扰的天然屏障。
小结
这篇掌握了 C 函数的四件事:定义与调用、用参数传数据用 return 交回结果、声明与头文件解决定义顺序问题、局部变量只在函数内有效。函数是 C 程序的基本积木,把重复逻辑收进函数,代码量降下来的同时可读性也会明显上升。
