C语言学习笔记_5函数与程序结构
2016-07-08 21:20
537 查看
/[b]****************************************************************************[/b]
*第五章函数与程序结构
*****2016年1月20日11:08:59
*韩–
*概述:
1、函数的定义域函数原型
2、函数调用与参数传递
3、作用域与可见性
4、存储类型
[b]****************************************************************************[/b]/
*第五章函数与程序结构
*****2016年1月20日11:08:59
*韩–
*概述:
1、函数的定义域函数原型
2、函数调用与参数传递
3、作用域与可见性
4、存储类型
[b]****************************************************************************[/b]/
1、函数的定义与函数原型
1-1函数的定义
C99标准要求任何函数都必须明确指定返回类型,不允许像C89那样默认返回int 与变量定义不同,每一个形参都必须带有数据类型和名字 养成良好的习惯,在每个函数的顶端用“/*……*/”格式注释 函数的命名要选择有意义的名称
1-2函数的返回值
return 表达式; 表达式的值的类型应该与函数定义的返回值的类型一致: 基本类型:如果不同,自动转化为函数类型 指针类型:如果不同,必须使用强制类型转换运算符将表达式的类型转换为函数类型 结构和联合类型:两个类型必须相同 如果返回0,代表程序正常退出 void类型(无返回值)的函数可以没有return语句 如果没有,函数执行到结束时的右花括号返回到函数调用处,叫做离开结束
1-3函数的声明
函数定义起函数声明的作用 函数定义出现在函数引用之后,则必须在之前给出函数原型,告诉编译器函数的相关参数 函数原型中函数名可以省略,eg: void GuessNum(int);《=》void GuessNum(int x); 函数原型凡在任何函数定义之外,则函数原型之后该文件中所有函数都可以调用他; 而放在某个函数定义中的函数原型只能在该函数中调用它。
1-4新增关键字
1)inline
> inline int add(int a,int b) { > return (a+b); > }
inline建议编译器将内联函数(inline)的函数体替换函数中出现的相关调用表达式 用增加代码量的代价换取时间上的节省 2)_Noreturn 告诉编译器此函数不返回到调用处,_Noreturn函数之后的代码不可到达
2、函数调用与参数传递
函数的调用三种出现形式:
1)作为表达式语句:putchar(c); 2)作为表达式中的一个操作数:c=getchar(); 3)作为函数调用的实参作为嵌套调用:while( putchar( getchar() ) != '#'); 实参的求值顺序: 由具体实现决定从左到右还是从右往左,所以尽量避免使用引起副作用的实参表达式 eg: power(a,a++);
3、作用域与可见性
作用域是指标识符(变量或函数 )的有效范围,代码中的变量分为全局变量和局部变量
局部变量在函数内部定义的变量,作用域仅限于定义该变量的!程序块! 全局变量在函数外部定义的变量,作用域为整个源程序 在函数中使用全局变量,一般要对该变量进行引用性说明,说明它的类型 说明符为:extern//其作用域通过extern声明语句可以扩展到应用点之前及其他文件 其实只要在外部变量定义之后的函数内引用并不需要说明,也就是说,好的编程习惯是把所有的外部变量的定义放在源文件的开始处
作用域规则:
1)文件范围。文件开头到结尾,全局变量和函数。 2)块范围。{ 与 } 之间,复合语句内定义变量。 3)函数原型范围。原型的( 与 )之间,函数原型说明的变量。 4)函数范围。函数体 { 与 } 之间,goto语句的标号。
可见性:
外层块的的变量名在内层块中是有效的 而当变量同名,那么内层的变量起作用,外层的变量名暂时失去作用 全局变量和局部变量也可以同名,在局部变量的作用域内,全局变量不可见
4、存储类型
程序占用的内存分为以下几个部分:
1)程序代码区:存放程序的二进制代码 2)静态数据区:存放程序运行期间用到的数据。 存储空间编译时分配,一直存在到程序结束由系统释放 3)动态数据区(栈区):也存放程序运行期间用到的数据。 存储空间由编译器自动分配释放。 4)堆区:由程序员分配释放,程序员不释放,程序结束后系统可能释放
存储类型
1)auto: 局部变量的默认存储类型为auto自动变量,作用域从定义它之后到块结束 每次进入都要重新分配释放,生命周期短暂 2)extern: 外部变量与外部函数得存储类型为extern 外部变量定义时没有初始化,其默认初值为0 extern即告诉编译器:“在本文件或其他文件中寻找该外部变量” 在定义变量或函数点之前或其他文件中调用要先用extern声明 3)static: 静态局部变量: 作用域于定义它的块,static变量表示在程序执行期间不会消失 它的值具有连续性,当退出块时,它的值可以保留下来 静态外部变量: 只能作用于定义它的文件,其他文件中的函数不能使用,不能用extern 静态函数: 把函数的作用限制在定义它的文件中,保证文件的独立性 4)register: 只能定义局部变量,寄存器变量 register只是建议编译器把该变量存储在计算机的高速硬件寄存器中 如果不能分配,当做自动变量处理,在栈上分配存储
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- 如何写好 C main 函数
- 注册表的组织结构
- Mootools 1.2教程 函数
- autoit InputBox 函数
- 文件遍历排序函数
- Ruby on Rails所构建的应用程序基本目录结构总结
- 关于C#中排序函数的总结
- Oracle 函数大全[字符串函数,数学函数,日期函数]第1/4页
- ASP下经常用的字符串等函数参考资料
- PostgreSQL教程(五):函数和操作符详解(1)
- DOS批处理 函数定义与用法
- asp Chr 函数 数字转字母的方法
- Lua中的函数精讲笔记
- Lua中的闭合函数、非全局函数与函数的尾调用详解
- Lua中调用C++函数示例
- Lua和C语言的交互详解
- Lua实现split函数
- Lua常用时间函数使用实例
- Lua函数与字符串处理简明总结