为什么需要函数

一段代码要在多处反复使用时,复制粘贴会让程序迅速膨胀,改一处还得记得改其他几处。函数把这段代码打包并起个名字,以后想用就喊一声名字,一处修改处处生效,程序也更容易读懂。

定义与调用函数

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 程序的基本积木,把重复逻辑收进函数,代码量降下来的同时可读性也会明显上升。