C语言之函数与预编译= =

函数定义

C语言程序框架
C语言程序的框架有两种:

1.一个main()单框架
2.一个main()+多个子函数复合框架

注意:
1.一个源程序文件可由一个或多个函数组成之函数
2.一个C语言程序可以由一个或多个源程序文伊组成。
3.C程序执行总是从main()开始,结束于main()结束;可调用其它函数
4.函数不能嵌套定义,但可以互相调用,不能调用main()

C语言函数分类
函数的分类:
(1)无参函数和有参函数
(2)库函数和用户自定义函数+main()

函数定义
1、函数定义

函数返回值类型  函数名(形式参数列表)
{
  函数体;
}

说明:
(1)函数体可以没有语句,但不能没有花括号,函数名后必须有一对小括号
(2)定义有参函数时,形参的定义可以采用传统方式或现代方式两种。
传统方式:

int max(x,y)
Int x,y,不能定义形参以外的其它变量
{}
现代方式:
int max(int x,int y)
{}

说明:
(3)不能在定义函数时在函数首部小括号后直接跟分号
如:

float fun(int x,int y);{}

(4)定义函数时,必须采用传统方式或现代方式指定形参的类型

函数调用

2、函数调用:两种方式

方式1:非void型
变量名=函数名(实参列表)
方式2:void型
函数名(实参列表);

例一:

int fun(int x,int y)
{ return x>y?x:y; 
}
main()
{
int a=9,b=7;max; 
max=a;
 max=fun(max,b); 
printf("max=%d",max);
}

结果:9
例二:

void fun(int x,int y)
int z; z=x>y?x:y;
printf("z=%d",z); 
main()
{
int a=7,b=9;max;
max=a;
fun(max,b);
printf("max=%d",max);
}

结果:z=9max=7

函数使用例题分析

3、函数使用例题分析
(1)原型声明
方式1:#include<头文件>
方式2:声明的格式:
函数类型 函数名(形参类型1形参1,形参类型2形参2…);
函数类型 函数名(形参类型1,形参类型2…);

原型声明

定义在上,调用在下
口诀:有头有体无分号----定义
有头有分号------原型声明语句
函数名(实参)----调用

函数调用过程

(2)函数调用过程
在进行函数调用时系统将实参值对应地(按位置次序对应)传给形参,是一种值的单向传递。
实参与形参之间有一个关系。
三一致:参数类型,次序,数量

在函数中的变量

1.函数定义与使用

有头有体无分号:函数定义
有类型有分号为函数声明语句

2.变量三属性

属性:类型(定义)、作用范围(内部,局部,外部,全局)、存储类别(4种:auto,static,register,extern----说明类别 )

类型

类型名 变量名列表;

例如:int x,y,z;
作用范围

分为:局部变量和全局变量
(1)局部变量(或称内部变量)
定义:在一个函数内部定义的变量为局部变量
a.局部变量只能在它所在的函数内有效。
b.在不同的函数中可以出现同名的变量,它们分别作用于不同的变量。(互不影响互不干扰)
c.复合语句中定义的变量只能在此复合语句中
d.所有形式参数都是局部变量。
例:

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

(2)全局变量(或称外部变量)
定义:在函数外部定义的变量为全局变量
a.全局变量的有效范围是在本文件内从定义该变量的位置开始到本文件的结束。
b.全局变量可以在它的有效范围内被每个函数引用。
c.在同一文件中若全局变量与局部变量同名,局部量“屏蔽”全局变量。
例:

int a;
void funl()
{
a=100;
}
void fun2()
{ 
a=1000; 
}
main()
{
a=10000;
}
//最终a被改为10000

例:

# 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);
}
//运行结果为:57
全局变量与局部变量同名时:局部变量屏蔽掉全局变量,局部变量有效性高于局部变量
存储类别

(1)auto类别变量
a.auto类别变量用完后释放所占用空间。(生命周期短)
b.局部变量默认为auto类别,无初始化时,初值为随机值。
c.使用时间短,一般都为auto类别变量(临时性变量)
(2)static类别变量(生命周期长)
a.static类别从定义到程序运行结束均占用存储空间。
b.全局部变量默认为static类别,无初始化时,初值为0。
c.static类别变量只进行一次初始化。
例:

#include<stdio.h>//静态变量static 
int fun(int x,int y)
{static int m=0,i=2;
i+=m+1;
m=i+x+y;
return m;
}
main()
{intj=4,m=1,k;
k=fun(j,m);
printf("%d",k);
k=fun(j,m);
printf("%d",k);
}
//输出结果:817

例:

#include<stdio.h>//静态变量static 
int d=1;
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

(3)register类别变量(寄存器类别)
a.register类别只能是局部变量才能被说明。
b.一般不能直接使用。

(4)extern类别变量
a.extern类别变量可以加大变量的作用范围
b.两个说明格式
格式1:定义同时说明类别:
存储类别类型名变量名;
格式2:分别定义、说明
类型名变量名;存储类别变量名;

预编译命令

1、预编译命令

标志:#
文件包含(include)
如:#include<>//在指定的标准搜索路径下搜索该库文件
如:#include""//扩大搜索范围,除了在标准搜索路径下搜索该库文件,还会在当前工作目录及其子目录下搜索

2、宏

define

第一种:无参宏定义
格式:#define 宏名 宏内容
功能:用一个指定的标识符(宏名大写)来代表一串字(宏内容)
如:#define PI 3.141592
如:#define N 10
宏名:符号常量,无语法检查,无类型
注:
(1)宏名我们一般用大写字母表示,遵守用户自定义标识符命名规则。
如:#define PI abcdefg
(2)#define可以在函教外定义也可以在函数内定义,但该命令应该在单独一行上。

undef命令可以提前终止宏名的作用域。

(3)在进行宏定义时,可以引用已经定义的宏名进行层置换。
(4)在进行宏替换时,必须先替换完所有的宏后再运算,同时替换过程中不能乱加括号。
口诀:原样替换,先替换,不要乱加括号,再按优先级计算
第二种:带参宏定义
如:#define宏名(参数列表)宏内容
功能:提供了一种更加灵活的替换方式。
如:#define s(x,y)x*y+2
注:
(1)在定义有参宏时,参数列表必须用一对小括号括起且小括号和宏名之间不能有空格
(2)对有参宏名进行替换时,需要将形参改成相应的实参,并且注意分清形参和实参的对应关系

例1:
#define N 5+4
a=N*N+30;====>5+4*5+4+30===>59
a=Num+30;
例2:
#define s(a,b)a*b
例3:
#defines(a,b)a*b

# include<stdio.h>
# define s(a,b) a*b
 main()
{ printf("s=%d",s(3,5)); //===>s=15
printf("s=%d",s(3+2,5+7));// ==>s=20
printf("s=%d",s((3+2),(5+7)));//===>s=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/=2+1*2+1/2+1*2+1==>a=a/7=>2
printf("%d",a);
}
//结果:2

复习例1:

# include<stdio.h>
int a=1;
 mian()
{ int s=3;
{ int a=5;s+=++a;}
s+=++a; 
printf("% din",s);
}
结果:11

例2

# include<stdio.h>
int w=3; 
fun(int k)
{ if(k==0) return w; 
return(fun(k-1)*k);
}
 main()
{
int w=10; 
printf("% d\n", fun(5)*w);
}
// 递归:几条语句,画图
结果:3600

简化:

# include<stdio.h>
int w=3; 
fun(int k)
{ if(k==3) return w ;
    return(fun(k-1)*k);
}
 main()
{
int w=10; 
printf("% d\n", fun(5)*w);
} 
结果:600

例:

int a,b; 
void fun()
{
a=100;
b=200;
}
main()
{int a=5,b=7;
 fun();
 printf("%d%d",a,b);
}
结果:57
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343