什么是C语言函数

else

{

move(n-1,x,z,y);

printf("%c-->%c\n",x,z);

move(n-1,y,x,z);

}

}

main()

{

int h;

printf("\ninput number:\n");

scanf("%d",&h);

printf("the step to moving %2d diskes:\n",h);

move(h,'a','b','c');

}

move(int n,int x,int y,int z)

{

if(n==1)

printf("%-->%c\n",x,z);

else

{

move(n-1,x,z,y);

printf("%c-->%c\n",x,z);

move(n-1,y,x,z);

}

}

main()

{ ……

move(h,'a','b','c');

}

从程序中可以看出,move函数是一个递归函数,它有四个形参n,x,y,z。n表示圆盘数,x,y,z分别表示三根针。move 函数的功能是把x上的n个圆盘移动到z 上。当n==1时,直接把x上的圆盘移至z上,输出x→z。如n!=1则分为三步:递归调用move函数,把n-1个圆盘从x移到y;输出x→z;递归调用move函数,把n-1个圆盘从y移到z。在递归调用过程中n=n-1,故n的值逐次递减,最后n=1时,终止递归,逐层返回。当n=4 时程序运行的结果为

input number:

4

the step to moving 4 diskes:

a→b

a→c

b→c

a→b

c→a

c→b

a→b

a→c

b→c

b→a

c→a

b→c

a→b

a→c

b→c

变量的作用域

在讨论函数的形参变量时曾经提到, 形参变量只在被调用期间才分配内存单元,调用结束立即释放。 这一点表明形参变量只有在函数内才是有效的, 离开该函数就不能再使用了。这种变量有效性的范围称变量的作用域。不仅对于形参变量, C语言中所有的量都有自己的作用域。变量说明的方式不同,其作用域也不同。 C语言中的变量,按作用域范围可分为两种, 即局部变量和全局变量。

一、局部变量

局部变量也称为内部变量。局部变量是在函数内作定义说明的。其作用域仅限于函数内, 离开该函数后再使用这种变量是非法的。

例如:

int f1(int a) /*函数f1*/

{

int b,c;

……

}a,b,c作用域

int f2(int x) /*函数f2*/

{

int y,z;

}x,y,z作用域

main()

{

int m,n;

}

m,n作用域 在函数f1内定义了三个变量,a为形参,b,c为一般变量。在 f1的范围内a,b,c有效,或者说a,b,c变量的作用域限于f1内。同理,x,y,z的作用域限于f2内。 m,n的作用域限于main函数内。关于局部变量的作用域还要说明以下几点:

1. 主函数中定义的变量也只能在主函数中使用,不能在其它函数中使用。同时,主函数中也不能使用其它函数中定义的变量。因为主函数也是一个函数,它与其它函数是平行关系。这一点是与其它语言不同的,应予以注意。 2. 形参变量是属于被调函数的局部变量,实参变量是属于主调函数的局部变量。

3. 允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不干扰,也不会发生混淆。如在例5.3 中,形参和实参的变量名都为n,是完全允许的。4. 在复合语句中也可定义变量,其作用域只在复合语句范围内。例如:

main()

{

int s,a;

……

{

int b;

s=a+b;

……b作用域

}

……s,a作用域

}[例5.11]main()

{

int i=2,j=3,k;

k=i+j;

{

int k=8;

if(i==3) printf("%d\n",k);

}

printf("%d\n%d\n",i,k);

}

main()

{

int i=2,j=3,k;

k=i+j;

{

int k=8;

if(i=3) printf("%d\n",k);

}

printf("%d\n%d\n",i,k);

}

本程序在main中定义了i,j,k三个变量,其中k未赋初值。 而在复合语句内又定义了一个变量k,并赋初值为8。应该注意这两个k不是同一个变量。在复合语句外由main定义的k起作用,而在复合语句内则由在复合语句内定义的k起作用。因此程序第4行的k为main所定义,其值应为5。第7行输出k值,该行在复合语句内,由复合语句内定义的k起作用,其初值为8,故输出值为8,第9行输出i,k值。i是在整个程序中有效的,第7行对i赋值为3,故以输出也为3。而第9行已在复合语句之外,输出的k应为main所定义的k,此k值由第4 行已获得为5,故输出也为5。

二、全局变量

全局变量也称为外部变量,它是在函数外部定义的变量。 它不属于哪一个函数,它属于一个源程序文件。其作用域是整个源程序。在函数中使用全局变量,一般应作全局变量说明。 只有在函数内经过说明的全局变量才能使用。全局变量的说明符为extern。 但在一个函数之前定义的全局变量,在该函数内使用可不再加以说明。 例如:

c语言 move函数,什么是C语言函数相关推荐

  1. 【C语言函数】 - 库函数、自定义函数、函数参数、函数调用、嵌套调用链式访问、递归与迭代、缓冲区

    目录 一.函数是什么 二.C语言中函数的分类 1.如何学会使用库函数 1.1.strcpy 1.2.memset 2.自定义函数 2.1.与库函数的区别 2.2.写一个函数可以找出两个整数的最大值 2 ...

  2. C语言函数大全-- i 开头的函数

    C语言函数大全 本篇介绍C语言函数大全– i 开头的函数 1. imagesize 1.1 函数说明 函数声明 函数功能 unsigned imagesize(int left, int top, i ...

  3. C语言程序设计(理论课)第八章 函数与宏定义

    第八章 函数与宏定义 8.1函数的概念 为什么要使用函数? ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ...

  4. c语言中min函数的作用,C语言库函数

    C语言库函数是把自定义函数放到库里,是别人把一些常用到的函数编完放到一个文件里,供程序员使用.程序员用的时候把它所在的文件名用#include<>加到里面就可以了(尖括号内填写文件名),例 ...

  5. c语言随机数生成0 99函数,C语言生成随机数的函数、延时函数

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 下面C语言代码使用了生成随机数的函数.延时函数.请大家仔细观察其显示效果. 从以下代码,我们可以得出一个重要的结论:当上述两类函数被放入循环时,应作出一定 ...

  6. R语言使用party包中的ctree函数构建条件推理决策树的流程和步骤、条件推理决策树是传统决策树的一个重要变体、条件推理树的分裂是基于显著性测试而不是熵/纯度/同质性度量来选择分裂

    R语言使用party包中的ctree函数构建条件推理决策树的流程和步骤(Conditional inference trees).条件推理决策树是传统决策树的一个重要变体.条件推理树的分裂是基于显著性 ...

  7. R语言ggplot2可视化:通过在element_text函数中设置ifelse判断条件自定义标签文本的显示格式:例如、粗体、斜体等

    R语言ggplot2可视化:通过在element_text函数中设置ifelse判断条件自定义标签文本的显示格式:例如.粗体.斜体等 目录

  8. R语言使用caret包中的createFolds函数对机器学习数据集进行交叉验证抽样、返回的样本列表长度为k个

    R语言使用caret包中的createFolds函数对机器学习数据集进行交叉验证抽样.返回的样本列表长度为k个 目录

  9. R语言使用ggplot2包的快速可视化函数qplot绘制基础密度图实战

    R语言使用ggplot2包的快速可视化函数qplot绘制基础密度图实战 目录 R语言使用ggplot2包的快速可视化函数qplot绘制基础密度图实战 #仿真数据

  10. R语言使用ggplot2包的快速可视化函数qplot绘制分组点图(带状图)并配置分组颜色实战

    R语言使用ggplot2包的快速可视化函数qplot绘制分组点图(带状图)并配置分组颜色实战 目录 R语言使用ggplot2包的快速可视化函数qplot绘制分组点图(带状图)并配置分组颜色实战 #仿真 ...

最新文章

  1. 2400门课:MIT开放迄今最全CS+电气工程课程
  2. monocross 环境搭建:MonoTouch Mono for Android
  3. php把年份转为int,PHP将DateInterval转换为int
  4. Tomcat下使用war包发布项目
  5. Windows网络驱动、NDIS驱动(微端口驱动、中间层驱动、协议驱动)、TDI驱动(网络传输层过滤)、WFP(Windows Filtering Platfrom))
  6. 【渝粤教育】电大中专会计电算化 (2)作业 题库
  7. android提示程序正在执行,Android中获取正在运行的进程(一)
  8. 二十九、制作首页的显示列表
  9. ruby+selenium-webdriver一步一步完成自动化测试(6)—-生成测试报告
  10. 选offer的5个维度
  11. 使用CAFFE训练自己的数据集并单张图片测试的方法
  12. 在GeoServer里设置图层的默认自定义样式,出现不显示预览图的情况(不起作用)...
  13. JAVA毕业设计婚纱摄影网设计计算机源码+lw文档+系统+调试部署+数据库
  14. nsight linux,NVIDIA为Nsight Systems增加Vulkan支持
  15. 【Python学习实践教程】10个Python经典项目实战,练手必备
  16. Java 导出Excel 自定义模板
  17. Axure 进阶教程
  18. pack_padded_sequence,pad_packed_sequence
  19. C# 利用AEC算法加密解密实现前台后台安全校验,附前端后台代码示例
  20. 从 Git 到区块链

热门文章

  1. 代码 生成迅雷链接启动迅雷下载
  2. 计算机主机前耳机没声音,电脑前面耳机没声音的解决办法 电脑前面插耳机没声音怎么办...
  3. java smtp服务器,用Java实现SMTP服务器
  4. Android11 WAPI证书安装流程
  5. 用友nc系统服务器端口号,用友NC数据库服务器参数配置说明
  6. 数学建模之秩和比综合评价方法(RSR)
  7. Windows Server 2012R2 安装IIS 的详细配置
  8. 使用Visio 2003 + Oracle 11g创建ERD,反向工程师失败了吗?
  9. 2018年上半年 系统分析师 论文 真题
  10. vb 远程连接 SQLserver数据库的连接语句