【C语言速成】8. 函数

函数像是一组被“包装”起来的代码,有了函数你就可以在需要重复某个操作的地方直接调用函数而不用重新写一遍代码。此外函数可以让代码更有条理,更便于理解。

用法

声明函数

一个函数由返回值类型、函数名、参数列表和函数体组成。正常情况下函数的声明语句会像下边这样:

返回值类型 函数名(参数1类型 参数1名称, 参数2类型 参数2名称...)
{
  代码
}
  • 函数可以有返回值,也可以没有返回值。如果有,那么C语言的函数就像数学里的函数一样,被调用后会得出一个结果,这个结果的数据类型就应该被设定成函数的返回值类型;如果函数不返回任何值,那么函数的返回值类型应该被设定成“void”。
  • 函数名的命名规则跟变量的命名规则一样,只能包含英文字母、数字和下划线,其中数字不能作为开头。
  • 参数列表是函数名后边的那个小括号,里边可以有或者没有参数。如果需要有参数,那么参数的声明就跟正常变量的声明差不多。参数没有初始值,不同的参数之间用英文逗号隔开,并且每个参数都需要写明类型。
  • 函数体是调用这个函数时应该执行的代码,写在大括号里。大括号里可以没有语句(函数什么都不做,只能在没有返回值时这么写)、有一条语句或者有多条语句。如果函数有返回值,无论如何必须返回一个值,否则程序会卡死。
    返回一个值时使用return语句,用法为:return 值;。return语句执行之后,函数会停止执行以后的代码并且把值返回给调用函数的语句。如果函数不返回值,也可以用return语句,用法为:return;,这样只会简单地停止函数的执行。
    你可以在函数体内使用参数,参数就像在执行函数体的语句之前创建的变量,使用参数就跟使用正常的变量一样,不同之处在于参数只能在函数体内使用。

示例

声明一个叫“hello”的函数,它不接受参数也不返回值,只在被调用时打印一行“Hello”:

void hello()
{
  puts("Hello");
}

声明一个叫“pf”的函数,它接受一个int型参数(在函数体内被命名为“i”),返回这个参数的平方:

int pf(int i)
{
  int i2 = i * i;
  return i2;
}

return语句可以返回一个字面值(在代码里写死了的,不会在程序运行时改变的常值,比如“1”、“"AABC"”、“'c'”),也可以返回变量或者一个表达式。所以上边的pf函数可以被简化为:

int pf(int i)
{
  return i * i;
}

声明一个叫f的函数,它接受一个字符(命名为“c”)和一个作为小整数使用的char参数(命名为“x”),返回这个字符的ASCII码加上后边的整数所得的ASCII码对应的字符:

char f(char c, char x)
{
  return c + x;
}

调用函数

假设在数学中有一个叫f的关于x的函数,使用这个函数就写成f(x),在C语言里使用函数时,写的代码跟这个就有些相似:

函数名(参数1值, 参数2值, ...)

传递给函数的参数的数量和每个参数的类型必须和函数声明时写的相匹配。如果函数不需要传递参数,小括号里就不写东西。

示例

用上文“声明函数”那一节的几个示例函数写一个小程序:
前几行的#include<stdio.h>和示例函数的声明语句有一部分被省略。如果没有特殊需要,函数声明语句应该放在main函数的大括号外,并且放在main函数上面、#include<stdio.h>的下面的那部分。
enter image description here

输入和输出

【电脑】Hello
【你】12A10
【电脑】144
【电脑】K

递归

递归指的是函数在函数体内调用自己的操作。

void f()
{
    puts("Hello");
    f();
}

上面的f函数就是一个递归函数,它先输出“Hello”再调用自己,而调用自己后又继续输出“Hello”再调用自己,以此往复。递归和循环有些不同,递归操作在达到一定深度(递归次数)后会导致程序崩溃,循环可以进行无限次而不导致崩溃,所以编写递归函数时一定要小心,确保它能在合适的时机返回。

示例

一个利用辗转相除法求两正整数的最大公因数的函数如下所示:

/**
 * 求两正整数的最大公因数。
 * @param n 第一个数。
 * @param m 第二个数。
 * @return n和m的最大公因数。
 */
int gcd(int n, int m)
{
    int a = n >= m ? n : m;
    int b = n <= m ? n : m;
    // “a ? b : c”是三元运算,等价于“if(a) return b; else return c;”
    int t = a % b;
    if(t==0) return b;
    return gcd(b, t);
}

后记

看完了函数这一章以后,你可能想到了在C语言的程序框架里

int main()
{
    //程序运行时执行的代码
}

这个main其实就是一个函数。main函数是C语言程序运行时第一个被调用的函数,所以如果没了main函数,或者它的名字被写错了,那么程序就通过不了编译了。

标签