函数的定义
1.逻辑上:能够完成特定功能的独立的代码块。
2.物理上:能够接收数据【也可以不接收数据】,能够对接收的数据进行处理【也可以不对数据进行处理】,能够将数据处理的结果返【也可以没有返回值】。
3.函数定义的本质:详细描述函数之所以能够实现某个特定功能的具体方法。
语法
返回值类型 函数名(形式参数列表)
{
函数体;
}
返回值类型:用户需要函数返回的数据类型。
函数名:代表的是函数的入口地址。
形式参数列表:就是用户将函数外部数据传入函数内部的 局部变量。
函数体:函数的具体功能代码。
代码示例
void max()
{
printf("最大值是:%d
")
}
形式参数列表(形参)
形参在函数定义的时候没有空间,只有在调用函数的时候形参才有空间。函数调用完形参自动释放。
代码示例
void max(int a, int b)
注意:在定义函数的时候,不要给形参赋值
函数存在的意义
- 避免了重复性操作。
- 有利于程序的模块化
代码实现
# include <stdio.h>
// 函数声明
void max(int i, int j)
{
//max是函数的名字, i和j是形式参数,简称形参 void表示函数没有返回值
if (i > j){
printf("%d
", i);
}else{
printf("%d
", j);
}
}
int main(void)
{
// 1.定义变量
int a, b, c, d, e, f;
a = 1, b = 2; c = 3, d = 9, e = -5, f = 100;
// 调用函数
max(a, b);
max(c, d);
max(e, f);
/*
if (a > b)
printf("%d
", a);
else
printf("%d
", b);
if (c > d)
printf("%d
", c);
else
printf("%d
", d);
if (e > f)
printf("%d
", e);
else
printf("%d
", f);
*/
return 0;
}
return 表达式含义
return是终止被调函数,向主调函数返回表达式的值,如果表达式为空,则只终止函数,不向被主函数返回任何值。
代码示例
# include <stdio.h>
int f()
{
//因为函数的返回值类型是int 所以最终f返回的是10而不是10.5
return 10.5;
}
int main(void)
{
int i = 99;
double x = 6.6;
x = f();
printf("%lf
", x);
return 0;
}
Break语句
是用来终止(就近的)循环和switch语句。而return是用来终止被调函数的。
# include <stdio.h>
void fmin(void)
{
int i;
for (i=0; i<5; ++i)
{
printf("大家辛苦了!
");
return; //return是终止函数的
}
printf("同志们好!
");
}
int main(void)
{
fmin();
return 0;
}
函数的分类
- 有参函数和无参函数。
- 有返回值和无返回值。
- 库函数和用户自定义函数。
- 普通函数和主函数(main函数)
注意事项
1.一个程序有且只有一个主函数。
2.主函数可以调用普通函数,普通不能调用主函数。
3.普通函数可以相互调用。
4.主函数是程序的入口,也是函数的出口。值传递函数和地址传递函数。
代码示例
# include <stdio.h>
//max是函数的名字, i和j是形式参数,简称形参 void表示函数没有返回值
void max1(int i, int j)
{
if (i > j)
printf("%d
", i);
else
printf("%d
", j);
}
int max2(int i, int j)
{
if (i > j)
return i;
else
return j;
}
int main(void)
{
int a, b, c, d, e, f;
a = 1, b = 2; c = 3, d = 9, e = -5, f = 100;
printf("%d
", max2(a, b));
printf("%d
", max2(c, d));
printf("%d
", max2(e, f));
/*
max1(a, b);
max1(c, d);
max1(e, f);
*/
return 0;
}
例子声明
//判断一个数是否素数,该数只能被1和本身整除
# include <stdio.h>
bool IsPrime(int val)
{
// 1.定义变量
int i;
// 2.变量循环
for (i=2; i<val; ++i)
{
if (val%i == 0)
break;
}
if (i == val)
return true;
else
return false;
}
int main(void)
{
int m;
scanf("%d", &m);
if ( IsPrime(m) )
printf("Yes!
");
else
printf("No!
");
return 0;
}
函数的声明
# include <stdio.h>
void fmax(void); //函数声明, 分号不能丢掉
int main(void)
{
fmax();
return 0;
}
void fmax(void)
{
printf("哈哈!
");
}
注意
当函数没有返回值时,那么规范的写法是要在函数中写明void的。如果函数调用写在了函数定义的前面,则必须加函数前置声明。
代码示例
# include <stdio.h>
//void fmin(void); //9行
void gmin(void)
{
fmin(); //因为函数f的定义放在了调用f语句的后面,所有语法出错
}
void fmin(void)
{
printf("哈哈!
");
}
int main(void)
{
gmin();
return 0;
}
形参和实参的关系
- 形参和实参个数是一一对应的。
- 形参和实参的位置也是一一对应的。
- 形参和实参的数据类型需要相互兼容。
# include <stdio.h>
void f(int i, float x) //形参
{
printf("%d
", i);
}
int main(void)
{
f(9.9, 6.6); //实际参数
return 0;
}
案列1
判断一个数是否是素数
代码示例
# include <stdio.h>
// 判断一个数是否是素数
int main(void)
{
int val;
int i;
scanf("%d", &val);
for (i=2; i<val; ++i)
{
if (0 == val%i)
break;
}
if (i == val)
printf("Yes!
");
else
printf("No!
");
return 0;
}
函数版代码示例
# include <stdio.h>
// 判断一个数是否是素数,函数实现
bool IsPrime(int val)
{
int i;
for (i=2; i<val; ++i)
{
if (0 == val%i)
break;
}
if (i == val)
return true;
else
return false;
}
int main(void)
{
int val;
int i;
scanf("%d", &val);
if ( IsPrime(val) )
printf("Yes!
");
else
printf("No!
");
return 0;
}
案例2
求1到某个数字之间(包括该数字)所有的素数。
代码示例
/*
求1到某个数字之间(包括该数字)所有的素数,并将其输出
只用main函数实现,有局限性:
1. 代码的重用性不高
2. 代码不容易理解
*/
# include <stdio.h>
int main(void)
{
int val;
int i;
int j;
scanf("%d", &val);
for (i=2; i<=val; ++i)
{
//判断i是否是素数,是输出,不是不输出
for (j=2; j<i; ++j)
{
if (0 == i%j)
break;
}
if (j == i)
printf("%d
", i);
}
return 0;
}
函数代码示例
/*
用两个函数来实现求1到某个数字之间所有的素数,并将其输出
代码量更少,可重用性更高
*/
# include <stdio.h>
//本函数的功能是: 判断m是否是素数,是返回true,不是返回false
bool IsPrime(int m)
{
int i;
for (i=2; i<m; ++i)
{
if (0 == m%i)
break;
}
if (i == m)
return true;
else
return false;
}
//本函数的功能是把1到n之间所有的素数在显示器上输出
void TraverseVal(int n)
{
int i;
for (i=2; i<=n; ++i)
{
if ( IsPrime(i) )
printf("%d
", i);
}
}
int main(void)
{
int val;
scanf("%d", &val);
TraverseVal(val);
return 0;
}
变量的作用域
局部变量
局部变量
在一个函数内部定义的变量或者函数的形参,都统称为局部变量。
void f(int i)
{
int j = 20;
}
i和j都是局部变量
局部变量的使用范围只能在本函数内部使用
全局变量
在所有函数外部定义的变量叫做全局变量。
全局变量使用范围:从定义位置开始到整个程序结束。
代码示例
# include <stdio.h>
/*
一定要明白该程序为什么是错的,
也要明白把9到12行代码放在14行后面,为什么程序就OK了
*/
void gmin() //9
{
printf("k = %d
", k);
} //12
int k = 1000; //14行
void fmax(void)
{
gmin();
printf("k = %d
", k);
}
int main(void)
{
fmax();
return 0;
}
变量命名冲突
在同一个范围之内不能定义两个一样的局部变量
/*
在一个函数内部,如果定义的局部函数的名字和全局变量名一样时,
局部变量会屏蔽掉全局变量,上例中最终的输出结果是8。
因为局部变量把全局变量给屏蔽掉了
*/
# include <stdio.h>
int i = 99;
void fmax(int i)
{
printf("i = %d
", i);
}
int main(void)
{
fmax(8);
return 0;
}