函数
C语言程序的框架
单框架:一个main()
复合框架:一个main()+多个子函数
函数的分类:
(1)无参函数和有参函数
(2)库函数和用户自定义函数+main()
int Max(int x,inty)
变量的三属性
(1)类型
类型名 变量名列表;
int x, y, z;
(2)作用范围(内部/局部,外部/全局)
局部变量:在一个函数内部定义的变量
注意:
a:局部变量只能在它所在的函数内有效
b:在不同的函数中出现同名的变量,互不影响,他们分别属于不同的变量
c:复合语句中定义的变量只能在此复合语句中有效
d:所以形式参数都是局部变量
#include<iostream>
#include<cstdio>
using namespace std;
int main(){
int a = 3, b = 9;
{
int a = 1, c = 7;
a = a + b;
b = c + a;
printf("a = %d, b = %d\n",a, b);
}
printf("a = %d, b = %d",a, b);
return 0;
}
//预期结果
a = 10, b = 17
a = 3, b = 17
全局变量:在函数外定义的变量
a:有效范围是在本文件内从定义该变量的位置开始到本文件的结束
b:全局变量可以在它有效范围内被每个函数引用/调用/使用
c:在同一文件中若全局变量与局部变量同名,局部变量“屏蔽”全局变量
#include<iostream>
#include<cstdio>
using namespace std;
int a = 1;
void fun1(){
a = 10;
}
void fun2(){
a = 100;
}
void fun3(){
a = 1000;
}
int main(){
/*
如果将下面的a = 10000;改写为int a = 10000
那么运行结果是:a = 10000
*/
// a = 10000;
// fun1();
// a = 2;
// fun2();
fun3();
printf("a = %d",a);
return 0;
}
//预期结果
a = 1000
#include<iostream>
#include<cstdio>
using namespace std;
int a, b;
void fun(){
a = 100;
b = 200;
}
int main(){
int a = 5, b = 7;
fun();
printf("%d%d\n", a, b);
return 0;
}
//预期结果
57
(3)存储类别
auto类别变量
a:auto类别变量用完后释放所占用空间
b:局部变量默认为auto类别,无初始化时,值为随机值
c:使用时间短,临时变量,一般都为auto类别变量
static静态变量
a:static类别从定义到程序运行结束均占用存储空间
b:全局变量默认为static类别,无初始化时,初值为0;
c:static类别变量只进行一次初始化。(不断刷新的一个变量)
#include<iostream>
#include<cstdio>
using namespace std;
int fun(int x, int y){
static int m = 0, i = 2;
i += m + 1;
m = i + x + y;
return m;
}
int main(){
int j = 4, m = 1, k;
k = fun(j, m);
printf("%d",k);
k = fun(j, m);
printf("%d",k);
return 0;
}
//预期结果
817
#include<iostream>
#include<cstdio>
using namespace std;
int d = 1;
int fun(int p){
static int d = 5;
d += p;
printf("%d",d);
return d;
}
int main(){
int a = 3;
printf("%d\n", fun(a + fun(d)));
return 0;
}
//预期结果
61515
register类别变量(寄存器类别,生命周期特别短)
a:register类别只能是局部变量才能被说明
b:一般不能直接使用
extern
a:可以加大变量的作用范围
#include<iostream>
#include<cstdio>
using namesapce std;
int main(){
extern x, y;//加大变量的作用范围
printf("%d,%d\n",x, y)
return 0;
}
int x, y;
/*
虽然没有在main函数里面对x和y进行变量的定义,而是将x和y
定义在了外部,但是程序同样可以正常执行,这就是extern发挥
了作用
*/
预编译命令
文件包含(include)
#include<库文件>
#include""
若文件a.c想要使用a1.c文件和a2.c文件
#include<a1.c>
#include<a2.c>
宏的定义:
(1)无参宏定义
格式:
#define 宏名 宏内容
功能:用一个指定的标识符(宏名--大写)来代表一串字符(宏内容)
如:
#define PI 3.1415926(独占一行)
#define N 10
Note:
a:宏名是一符号常量
b:无语法检查
c:无类型,就是一常量
(2)有参宏定义
格式:
#define 宏名(参数列表) 宏内容
功能:提供了一种更加灵活的替换方式
如:
#define s(x,y) x*y+2
s(6,9)相当于是6*9+2
口诀:
原模原样替换,不要乱加括号,先替换在按优先级计算,宏名与参数列表之间千万千万千万不要加空格
#define N 5+4
a = N * N + 30;
相当于:5 + 4 * 5 + 4 + 30 = 59
a = Num + 30;不会替换,别当憨憨
#include<iostream>
#include<cstdio>
//#define s(a,b) a * b
using namespace std;
#define s(a,b) a * b
int 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
return 0;
}
//预期结果
s = 15s = 20s = 60
#include<iostream>
#include<cstdio>
using namespace std;
#define SQR(x) x*x
int 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);
return 0;
}
//预期结果:
2
Note:
(1)一个源程序文件可有一个或多个函数组成
(2)一个C语言程序可以由一个或多个源程序文件组成。
函数的返回值类型:两类
void型
一定不要加return语句
函数调用:函数名(实参列表);
非void型
return 表达式;
函数调用:变量名 = 函数名(实参列表);
函数调用:
单向传值
遵循三一致:个数、类型、位置次序
口诀:
①有头有体无分号----定义
②有头有分号-----原型申明语句
③函数(实参)------函数调用
#include<iostream>
#include<cstdio>
using namespace std;
void fun(int x,int y){
int z;
z = x > y ? x : y;
printf("z=%d",z);
}
int main(){
int a = 7, b = 9, max;
max = a;
fun(max, b);
printf("max = %d",max);
return 0;
}
//预期结果
z=9max=7
#include<iostream>
#include<cstdio>
using namespace std;
//函数的原型申明
void sum(int x, int y);
int main(){
sum(3.0,5.0);
return 0;
}
void sum(int x, int y){
printf("%d",x+y);
}
//预期结果
8
#include<iostream>
#include<cstdio>
using namespace std;
int a,b;
void fun(){
a = 100;
b = 200;
}
int main(){
int a = 5, b = 7;
fun();
printf("%d%d",a,b);
return 0;
}
//预期结果
57
#include<iostream>
#include<cstdio>
using namespace std;
func(int x){
x = 20;
}
int main(){
int x = 10;
func(x);
printf("%d",x);
return 0;
}
//预期结果
10
函数的经典练习题
#include<iostream>
#include<cstdio>
using namespace std;
int a = 1;
int main(){
//s自始自终都有一个s
int s = 3;
//int a = 2; //预期结果:12
{
int a = 5;
s += ++a;
}
s += ++a;
printf("%d\n",s);
return 0;
}
//预期结果
11
#include<iostream>
#include<cstdio>
using namespace std;
int w = 3;
int fun(int k){
if(k == 0){
return w;//w = 3
}
return(fun(k - 1)* k);//直接递归
}
int main(){
int w = 10;
printf("%d\n", fun(5) * w);//w = 10
return 0;
}
//预期结果
3600