函数基础

典型的函数定义:

  • 包括返回类型、函数名字、由0个或多个形参组成的列表以及函数体。
  • 形参以逗号隔开,形参的列表位于一对圆括号之内。
  • 函数执行的操作在语句块中说明,该语句块成为函数体。

通过调用运算符来执行函数:

  • 调用运算符的形式是一对圆括号,作用于一个表达式,该表达式时函数或者指向函数的指针。
  • 圆括号之内是一个用逗号隔开的实参列表,用实参初始化函数的形参。
  • 调用表达式的类型就是函数的返回类型。

编写函数

//val的阶乘是val*(val-1)*(val-2)...*((val-(val-1))*1)
int fact(int val)
{
    int ret=1;//局部变量,用于保存计算结果
    while (val > 1)
        ret *= val--;//把ret和val的乘积赋给ret,然后将val减1
    return ret;//返回结果
}

while循环内部,在每次迭代时用后置递减运算符将val的值减一。

调用函数

int main()
{
    int j = fact(5);
    cout<<"5! is "<<j<<endl;
    return 0;
}
  • 用实参初始化函数对应的形参
  • 将控制权转移给被调用函数

主函数的执行被暂时中断,被调函数开始执行。执行函数的第一步是(隐式地)定义并初始化它的形参。

return语句完成工作:

  • 返回return语句中的值(如果有的话)
  • 将控制权从被调函数转移回主调函数

fact函数的调用等价于:

    int val = 5;//用字面值5初始化val
    int ret = 1;//fact函数体内的代码
    while (val > 1)
        ret *= val--;
    int j = ret;//用ret的副本初始化j

形参和实参

  • 编译器能以任意可行的顺序对实参求值。
  • 实参的类型必须与对应的形参类型匹配。

fact函数只有一个int类型的形参,所以每次调用它的时候必须提供一个能转换成int的实参:

    fact("hello");//错误:实参类型不正确
    fact();//错误:实参数量不足
    fact(42, 10, 0);//错误:实参数量过多
    fact(3.14);//正确:该实参能转换成int类型

函数的参数列表

函数的形参列表可以为空,但是不能省略,常用的办法是书写一个空的形参列表,也可以使用关键词void表示函数没有形参:

void f1() {/*...*/ }//隐式地定义空形参列表
void f2(void){/*...*/ }//显式地定义空形参列表

即使两个形参的类型一样,也必须把两个类型都写出来:

int f3(int v1,v2){/*...*/ }//错误
int f4(int v1, int v2) {/*...*/}//正确

任意两个形参都不能同名,而且函数最外层作用域中的局部变量也不能使用与函数形参一样的名字。

函数的返回类型

  •  特殊的返回类型是void,表示函数不返回任何值。
  • 函数的返回类型不能是数组类型函数类型,但是可以是指向数组或函数的指针
posted @ 2019-06-25 09:56  CodeWithMe  阅读(163)  评论(0)    收藏  举报