-
函数定义
void sum(int begin, int end)
{
int i;
int sum = 0;
for(i=begin; i<=end; i++){
sum += i;
}
printf("%d到%d的和是%d\n", begin, end, sum);
}
上面的代码中,第一行是函数头,void是返回类型,sum是函数名,int begin, int end是参数表,大括号内的内容是函数体。
-
函数调用
形式:函数名(参数值);
注:括号()起到了表示函数调用的重要作用,即使没有参数也要有括号,有参数则需要给出正确的数量和顺序,
-
函数返回
return停止函数的执行,并送回一个值,格式为:
return;或 return 表达式
一个函数里可以出现多个return语句。
从函数中返回值,可以赋值给变量,可以再传递给函数,甚至可以丢弃,有的时候要的是副作用。
-
没有返回值的函数
void 函数名(参数表)
是不能使用带值的return的,可以没有return, 调用的时候不能做返回值的赋值。
如果函数有返回值,则必须使用带值的return。
-
函数原型
函数是有先后关系的,如果把main函数放到自己定义的函数前面,当编译器看到函数调用的时候,旧标准会假设所调用的函数所有的参数都是int,返回值也是int,如果恰好不对的话就会报错。
这时候函数原型就起作用了,形式为:
double max(double a, double b);
函数头,以分号结尾构成,就是为了让编译器知道这个函数长什么样子,包括名称,参数(数量和类型),返回类型。现在一般把函数原型写在调用它的函数前面,原型里可以不写参数的名字,但是一般要写上。
-
参数传递
如果函数有参数,调用函数时必须传递给它数量、类型正确的值。
可以传递给函数的值是表达式的结果,包括变量,函数的返回值和计算的结果等。如:
int a, b, c;
a = 5;
b = 6;
c = max(10, 12);
c = max(a, b);
c = max(c, 23);
c = max(max(23, 45), a);
c = max(23+45, b);
-
类型的匹配问题
调用函数时给的值与参数的类型不匹配的话C语言的编译器会悄悄的替你把类型转换好,C++和Java在这方面比较严格。
-
值传递
C语言在调用函数时只能传值给函数。
每个函数都有自己的变量空间,参数也位于这个独立的空间中,和其他函数没有关系,关于形参和实参,因为比较容易搞混,所以我们一致把它们称作参数和值。
-
本地变量
函数每次运行,就产生了一个独立的变量空间,在这个空间中的变量,是函数的这次运行所独有的,称作本地变量。
即:定义在函数内部的变量就是本地变量。
参数也是本地变量。
-
变量的生存期和作用域
生存期:什么时候这个变量开始,到什么时候消失。
作用域:代码的什么地方这个变量可以起作用。
对于本地变量来说,这两者是一致的,都是在函数的大括号内。
-
本地变量的规则
本地变量是定义在块内的,它可以是定义在函数的块内,
也可以是定义在语句的块内,
甚至可以随便拉一对大括号来定义变量,
程序运行进入这个块之前,其中的变量不存在,离开这个块,其中的变量就消失了。
块外面定义的变量在里面仍然有效,块里面定义了和外面同名的变量则掩盖了外面的。
不能在一个块内定义同名的变量,
本地变量不会被默认初始化,参数是在进入函数的时候被初始化了。
-
需要注意的细节
f(a, b)和f((a, b))
后者是一个参数,因为括号内的是一个逗号运算符。
C语言不允许函数的嵌套定义。但是可以写函数的声明。
int i, j, sum(int a, int b);这种写法在C语言中是允许的,但是一般不建议。
return (i);也是可以这样写的。但不建议。
如果函数没有参数的话写成void max(void); 但是如果写成void max();一般表示函数的参数表未知,并不表示没有参数。
关于main函数其实可以写成main(void),return的0也是有人看的,在不同的操作系统中通过不同的代码就可以看到返回的结果。
来源自MOOC