您的位置:首页 > 编程语言 > C语言/C++

C语言学习笔记_5函数与程序结构

2016-07-08 21:20 537 查看
/[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语言