第七章:函数
C语言程序的框架有两种:
1.一个main() 单框架
2.一个main()+多个子函数 复合框架
注:
1.一个源程序文件可由一个或多个函数组成
2.一个C语言程序可以由 个或多个源程序文件组成 语言程序可以由一个或多个源程序文件组成。
3.C程序执行总是从main()开始,结束于main()结束;可调
用其它函数
4. 函数不能嵌套定义,但可以互相调用,不能调用main()
函数的分类:
(1)无参函数和有参函数
(2)库函数和用户自定义函数+main( )
1.函数定义
函数返回值类型 函数名(形式参数列表)
{
函数体;
}
说明:
-
函数体可以没有语句,但不能没有花括号,函数名后必须有一对小括号
-
定义有参函数时,形参的定义可以采用传统方式或现代方式两种
-
不能在定义函数时在函数首部小括号后直接跟分号
-
定义函数时,必须采用传统方式或现代方式指定形参的类型
-
函数返回值类型:非void型和void型
-
函数名必须符合用户自定义规则
2.函数调用
函数调用:两种方式
方式1: void型
变量名=函数名(实参列表);
方式2: 非void型
函数名(实参列表);
3.函数使用例题分析
-
原型声明
声明的格式:
-
函数类型 函数名(形参类型1 形参1,形参类型2 形参2…);
-
函数类型 函数名(形参类型1 形参1,形参类型2 形参2…);
-
例:void sum(int x,int y); /函数原型声明/
-
-
函数调用过程
在进行函数调用时系统将实参值对应地(按位置次序对应)传给形参,是一种值的单向传递
4.变量的三属性
变量三属性:类型、作用范围、存储类别
-
变量三属性:类型
类型名 变量名列表;
例如:int x,y,z; -
变量三属性:作用范围
分为:局部变量和全局变量
-
局部变量(或称内部变量)
定义:在一个函数内部定义的变量为局部变量-
局部变量只能在它所在的函数内有效
-
在不同的函数中可以出现同名的变量,它们分别属于不同的变量
-
所有形式参数都是局部变量
-
复合语句中定义的变量只能在此复合语句中有效(使用{}包裹起来的语句)
int main() { int a=3,b=9; { int a=1,c=7; a=a+b; b= c+a; printf("a=%d,b=%d",a,b); } printf("a=%d,b=%d",a,b); } /*a=10,b=17a=3,b=17*/
-
-
全局变量(或称外部变量)
定义:在函数外部定义的变量为全局变量-
全局变量的有效范围是在本文件内从定义该变量的位置开始到本文件的结束
-
全局变量可以在它的有效范围内被每个函数引用
-
在同一文件中若全局变量与局部变量同名,局部变量“屏蔽”全局变量
#include<stdio.h> int a,b; void fun() { a=100; b=200; } main() { int a=5,b=7; fun(); printf("%d-%d\n",a,b); } /*5-7*/ /***********************************/ ```c #include<stdio.h> int a,b; void fun() { a=100; b=200; } main() { fun(); printf("%d-%d\n",a,b); } /*100-200*/
-
-
变量三属性:存储类别
-
auto类别变量
-
auto类别变量用完后释放所占用空间
-
局部变量默认为局部变量默认为auto类别,无初始化时,初始值随机
-
使用时间短,一般都为auto类别变量
-
-
static类别变量
-
static类别从定义到程序运行结束均占用存储空间
-
全局部变量默认为static类别,无初始化时,初值为0
-
static类别变量只进行一次初始化
int d=1; int fun(int p) { static int d=5; d+=p; printf("%d",d); return (d); } main() { int a=3; printf("%d\n",fun(a+fun(d))); } /*61515*/
-
-
register类别变量
-
register类别只能是局部变量才能被说明
-
一般不能直接使用
-
-
extern类别变量
-
extern类别变量可以加大变量的作用范围
-
两种说明格式(其他三种没有)
-
格式1:定义同时说明类别:存储类别 类型名 变量名;
-
格式2:分别定义、说明:
类型名 变量名;
存储类别 变量名;
#include<stdio.h> main() { extern x,y; printf("%d,%d\n",x,y); } int x,y;
-
-
-
-
5.预编译命令
-
预编译命令
文件包含(include):#include< >、 #include" "
-
宏
-
第一种:无参宏定义
-
格式:#define 宏名 宏内容
-
功能:用一个指定的标识符(宏名)来代表一串字符
-
如:#define PI 3.141592
注:
-
宏名我们一般用大写字母表示,遵守用户自定义标识符命名规则
-
#define可以在函数外定义也可以在函数内定义,但该命令应该在单独 但该命令应该在单独行上
-
#undef命令可以提前终止宏名的作用域
-
在进行宏定义时,可以引用已经定义的宏名进行层层置换
-
在进行宏替换时,必须先替换完所有的宏后再运算,同时替换过程中不能乱加括号
-
-
第二种:带参宏定义
-
#define 宏名(参数列表) 宏内容
-
功能:提供了一种更加灵活的替换方式
-
如:#define s(x,y) x*y+2
注:
-
在定义有参宏时,参数列表必须用一对小括号括起且小括号和宏名之间不能有空格
-
对有参宏名进行替换时,需要将形参改成相应的实参,并且注意分清形参和实参的对应关系
#define N 5+4 a=N*N+30; /*a=5+4*5+4+30*/ /*a=59*/
#include<stdio.h> #define s(a,b) a*b main() { printf("s=%d",s(3,5)); /*15*/ printf("s=%d",s(3+2,5+7)); /*20*/ printf("s=%d",s((3+2),(5+7))); /*60*/ }
#include<stdio.h> #define SQR(x) x*x main() { int a=16,k=2,m=1; a/=SQR(k+m)/SQR(k+m); //a/=k+m*k+m/k+m*k+m printf("%d",a);/*a/=7,a=2*/ }
-
-