# include<stdio.h> //max是函数的名字,i和j是形参(形式参数),void表示函数没有返回值 void max(int i,int j) { if(i > j) printf("%d\n",i); else printf("%d\n",j); } //int表示返回一个整型值 int main(void) { 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); return 0; }
为什么需要函数
避免了重复性操作
有利于程序的模块化
什么叫做函数
逻辑上:能够完成特定功能的独立的代码单元
物理上:能够接收数据【当然可以不接收数据】,能够对接收的数据进行处理,能够将数据处理的结果返回【也可不返回任意值】
总结:函数是一个工具,它是为了解决大量类似问题而设计的
# include<stdio.h> int f(void) //括号中的void表示该函数不能接受数据 int表示函数返回值是int类型 { return 10; //向主调函数返回10 (main主调函数,f被调函数) } void g(void) //函数名前面void表示该函数没有返回值 { //return 10; //与上面void相矛盾 } int main(void) { int j = 88; j = f(); printf("%d\n",j); return 0; }
如何定义函数
格式:
函数的返回值 函数的名字(函数的形参列表)
{
函数的执行体
}
1.函数定义的本质是详细描述函数之所以实现某个特定功能的实现方法
2.return表达式的含义:
1.终止被调函数,向主调函数返回表达式的值
2.如果表达式为空,则只终止函数,不向主调函数返回任何值
3.break是用来终止循环和switch的,return是用来终止函数的
例子:
void f()
{
return; //return只用来终止函数,不向主调函数返回任何值
}
int f()
{
return 10; //第一:终止函数 第二:向主调函数返回10
}
3.函数返回值的类型也称为函数的类型,因为如果函数名前面的返回值类型和函数执行体中的return表达式中表达式的类型不同的话,则最终函数返回值的类型以函数名前的返回值类型为准
函数的分类
有参函数 和 无参函数
有返回值 和 无返回值
库函数 和 用户自定义函数
值传递函数 和 地址传递函数
普通函数 和 主函数(main函数)
一个程序必须有且只能有一个主函数
主函数可以调用普通函数 普通函数不能调用主函数
普通函数可以相互调用
主函数是程序的入口,也是程序的出口
# include<stdio.h> /*求素数*/ bool IsPrime(int val) { int i; 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!\n"); else printf("No!\n"); return 0; }
注意的问题
# include<stdio.h> void f(void); //函数申明,分号不能丢掉 int main(void) { f(); return 0; } /* void f(int); //函数申明,分号不能丢掉 int main(void) { f(); //error,申明中为int类型,而这里没有 return 0; } */
# include <stdio.h> void f(void); //除非这里申明一下 void g(void) { f(); //因为函数f的定义放在了调用f语句的后面,所有语法出错 } void f(void) { printf("哈哈!\n"); } int main(void) { return 0; } /* void g(void) { f(); //因为函数f的定义放在了调用f语句的后面,所有语法出错 } void f(void) { printf("哈哈!\n"); } int main(void) { return 0; } */
函数调用和函数定义的顺序
如果函数调用写在了函数定义的前面,则必须加函数前置申明
函数前置申明:
1.告诉编译器即将可能出现的若干个字母代表的是一个函数
2.告诉编译器即将可能出现的若干个字母所代表的函数的形参和返回值的具体情况
3.函数申明是一个语句,末尾必须加分号
4.对库函数的申明是通过#include<库函数所在的文件名字.h>来实现的
形参和实参
个数相同 位置一一对应 数据类型必须相互兼容
如何在软件开发中合理的设计函数来解决实际问题
一个函数的功能尽量独立,单一
多学习,多模仿牛人的代码
函数是C语言的基本单位,类是Java,C#,C++的基本单位
常用的系统函数
double sqrt(double x);
求x的平方根
int abs(int x)
求x的绝对值
double fabs(double x)
求x的绝对值
专题:
递归
数据结构视频
变量的作用域和存储方式:
按作用域分:
全局变量:
在函数外部定义的变量,叫做全局变量
全局变量使用范围:从定义位置开始到整个程序结束
局部变量:
在一个函数内部定义的变量或者函数的形参,都统称做局部变量
void f(int i)
{
int j = 20;
}
i和j都属于局部变量
局部变量使用范围:只能在函数内部使用
注意的问题:
全局变量和局部变量命名冲突的问题
在一个函数内部如果定义的局部变量的名字和全局变量名字一样时,局部变量屏蔽全局变量
按变量的存储方式
静态变量
自动变量
寄存器变量