函数的语法规则:
type function_name(parameter) { }
type为函数的返回值类型
function为函数名
parameter为函数的参数(可以为多个)
{}之间的为函数体,即所执行的代码编写一个两整数相乘的函数:
int mul(int x, int y) //定义函数。x、y为整形参数,返回值类型为整形。 { int z = x * y; return z; //建议把return语句返回的类型和函数参数返回值的设置为同一类型 } //或者写成: int mul(int x, int y) { return x * y; }
return语句的理解:
- return后面可以是一个数值,也就可以是一个表达式,如果是表达式则先执行表达式,再返回表达式的结果
- return后边也可以什么都没有,直接写return,这种写法适合函数类型是void的情况
- return语句执行后,函数彻底返回,后边的代码不再执行。
- 如果函数中存在if等分支语句,则要保证每种情况下都有return返回,否则会出现编译错误
#include <stdio.h> int mul(int x, int y) //定义函数。x、y为整形参数,返回值类型为整形。 { int z = x * y; return z; //建议把return语句返回的类型和函数参数返回值的设置为同一类型 } int main() { int a = 2; //a、b为实参 int b = 3; int c = mul(a, b); printf("%d", c); return 0; }
运行结果为:
6
关键字static和extern的使用:
作用域是程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效的(可用的),而限定这个名字的可用性的代码范围就是这个名字的作用域。
局部变量的作用域是变量所在的局部范围
全局变量的作用域是整个工程(项目)
生命周期指的是变脸的创建(申请内存)到变量的销毁(收回内存)之间的一个时间段
局部变量的生命周期是:进入作用域变量创建,生命周期开始,出作用域生命周期结束
全局变量的生命周期是:整个程序的生命周期
static修饰局部变量时,局部变量的生命周期和程序的生命周期一样,但作用域不变。
对比以下的两次程序,即可得出上述结论。
#include <stdio.h> void test() { int i = 0; //这里的i的作用域是函数的所在的范围,其生命周期是从执行这一句代码 //(即向内存申请空间)到函数执行完毕(i为局部变量)。函数执行完毕之后,i //所占的空间就被销毁了。 i++; printf("%d ", i); } int main() { int i = 0; //i为全局变量,作用范围为主函数(main函数)所在的范围,生命周期为程序的生 //命周期,知道程序执行完毕,生命周期才会结束 for (i = 0; i < 5; i++) { test(); } return 0; }
运行结果:
1 1 1 1 1
#include <stdio.h> void test() { static int i = 0; //这里的i的生命周期是整个程序的生命周期,其作用范围为test函数所在的范 //围。当第一次执行test函数之后,i所占的空间不会被销毁,直到整个程序结束 //为止,i所占的空间才会被销毁 i++; printf("%d ", i); } int main() { int i = 0; for (i = 0; i < 5; i++) { test(); } return 0; }
运行结果:
1 2 3 4 5
static修饰全局变量或函数时,这个全局变量或函数只能在定义这个变量或函数的文件中使用,不能在其它文件中使用
关键字extern可以使用外部文件中的变量:
文件a.c中的代码:
int a = 0;
在文件b.c中想使用a.c中的变量需要在文件b中写入下面的代码:
extern int a;