C语言-6、函数与预编译

函数
  
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

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值