C语言函数
函数的定义
语法格式
函数返回值的类型 函数名(行参类型 行参1, 行参类型 行参2, ...) /*函数首部*/ { /*函数体*/ 声明部分; 语句部分; }
说明
- 在定义时,若省略了函数返回值的类型,则默认为int型。
- 在同一程序中,函数名必须唯一;同一函数中,行参名也必须唯一。
- 行参之间用逗号隔开,可以没有行参。
- 除行参外,凡是在函数中用到的变量或是其它函数必须先进行声明,再使用。
- 行参和函数体中的变量只在函数被调用时才临时分配存储单元。
- 函数的定义时平行的,不能再一个函数内部再定义函数。
函数的返回值
函数的返回值通过return语句返回。
语法格式
return [expression];
说明
- 函数定义的类型决定函数返回值的类型,若不一致,则自动转换为函数定义类型。
- 为了明确说明函数无返回值,可将函数的返回值类型定义为“void”,称为“空类型”。
函数的调用
语法格式
函数名(实参1,实参2,...)
说明
- 实参与行参在个数、类型及次序上应保持一致。
- 函数必须先定义或声明,后调用。返回值类型为int或char的函数可例外。
- 实参向行参传递数据时按位置对应传递,而不是按名字对应传递。
- 当实参表包含多个参数时,对实参表的求值顺序因C语言的版本不同而有所不同。如max(i,++i)。
- 传值调用:实参向行参传递的数据是一种单向传递。实参的值传递给对应的行参,但行参的值不回回传给实参。
- 传址调用:数组或指针类型实参是将变量在内存中的首地址传递给行参,这样实参和行参中用相同的内存空间,在函数调用结束后,实参变量的值也将发生变化。
- 嵌套调用:函数的定义不允许嵌套,但函数的调用可以嵌套,即在调用一个函数的过程中,又调用另一个函数。
- 递归调用:函数可以直接或间接地自己调用自己。(递推是由已知求未知,递归则相反)。
函数的声明
凡是未在调用之前定义的函数,C编译程序默认其返回值类型为int。
对于返回值为其它类型的函数,若把函数定义放在调用之后,则应在调用之前对函数进行声明。
语法格式
类型名 函数名(行参类型1 行参1,行参类型2 行参2,...)
说明
- 函数声明中的行参名是一种虚设,它们可以是任意的用户标识符,既不必与函数首部中的行参名一致,又可与程序中任意的用户标识符相同。因此,参数名可以省略。但参数的类型、个数和次序必须与函数定义的首部保持一致。
- 函数的声明与定义不同。定义是写出函数的完整形式,而声明是告诉系统此函数的返回值类型、参数类型及个数。
- 若函数的返回值类型为int或char,则可不必进行函数声明。但此时系统无法对参数做类型检查。
- 若定义在前,调用在后,则可不进行函数声明。
- 放在调用函数的声明部分,则只有此函数可以识别被调函数。
- 放在所有函数的外部且在被调用之前,则函数声明位置后面的所有函数均可识别被调用函数。
- 调用库函数时,要在程序的开头使用"#include"来包含相关头文件,就是因为头文件中包含了这些库函数的声明。