上一篇我们学了 C 语言的基础语法,所有代码都写在 main 函数里。但真实的程序不可能把所有逻辑塞在一个函数中,我们需要把代码拆分成多个函数,让每个函数负责一件事。
定义与调用
一个函数由返回类型、函数名、参数列表和函数体组成:
你应该注意到了 main 函数末尾的 return 0。main 是 C 程序的入口函数,程序从这里开始执行。它的返回值是一个整数,表示程序的退出状态:return 0 表示正常退出,return 1(或其他非零值)表示异常退出。操作系统和调用方可以根据这个返回值判断程序是否执行成功。
你可以试着把上面代码中的 return 0 改成 return 1 运行一下,会发现程序输出结果虽然一样,但运行环境会报告一个非零的退出码,认为程序异常退出了。
返回多个值?
C 语言的函数只能返回一个值。如果需要「返回」多个值,通常的做法是传指针进去让函数修改。不过指针我们下一篇再讲,这里先记住这个限制。
声明顺序与前向声明
C 语言要求函数在调用之前必须已经定义或声明过,否则编译器会报错。
如果你习惯把 main 写在前面、辅助函数写在后面,就需要在前面加一个函数声明(也叫函数原型),告诉编译器「这个函数存在,具体实现在后面」:
当然,如果你把辅助函数写在 main 前面,就不需要前向声明了。在刷算法题时,直接把辅助函数写在 main 上面最简单。
值传递
C 语言的函数参数默认是值传递,也就是说传进去的是值的副本,在函数内修改参数不会影响外面的变量:
a 的值传给了 x,但 x 只是 a 的副本,修改 x 不会影响 a。
这就好比你把一个数字抄在纸条上递给别人,别人在自己的纸条上怎么改都行,你手里的原件不受影响。
那如果我确实想在函数里修改外面的变量呢?别急,下一篇我们来学 C 语言最核心的特性:指针,它能解决这个问题。
小结
函数让你把代码拆成可复用的小块,避免重复。函数由返回类型、函数名、参数列表和函数体组成。如果函数定义在调用之后,需要在前面加一个前向声明。C 语言默认使用值传递,函数内修改参数不会影响原变量。
下一篇我们来学指针,C 语言的灵魂。