C语言程序设计核心详解 函数和预编译命令
1.函数的定义和使用1.1 函数定义C语言程序的框架有两种一个main()单框架一个main()多个子函数注一个源程序文件可由一个或多个函数组成一个C语言程序可以由一个或多个源程序文件组成C程序执行总是从main()开始结束于main()结束可调用其它函数函数不能嵌套定义但可以相互调用不能调用main()函数的分类无参函数和有参函数库函数和用户自定义函数main()函数格式42头4体2头返回值类型 函数名 形式参数列表体{} 函数体代码语言cAI代码解释函数返回值类型 函数名(形式参数列表) { 函数体 }说明(1)函数体可以没有语句但不能没有花括号函数名必须有一对小括号。(2)定义有参函数时形参的定义可以采用传统方式或现代方式两种。代码语言cAI代码解释一般来说我们都用现代方式 int maxint xint y 传统方式 int max(int x,int y) Int x,y 不能定义形参以外的其它变量 {}(3)不能在定义函数时在函数首部小括号后直接跟分号如代码语言cAI代码解释float fun(int x,int y) { }(4) 定义函数时必须采用传统方式或现代方式指定的形参类型(5) 函数返回值类型两类(非void和void代码语言cAI代码解释形式1非void: int fun(int x, int y) { return 表达式 }代码语言cAI代码解释形式1void: void fun(int x, int y) { 一定不要加return语句 }1.2 函数调用方式1:非void型变量名函数名实参列表;方式2:void型函数名实参列表;1.3 函数使用例题分析1.3.1 原型声明有时候主函数在上其他函数在下面所以需要先在主函数上方声明函数告诉计算机有这个函数才能在主函数中使用方式1(库函数:#include头文件方式2声明的格式:声明的格式函数类型 函数名形参类型1 形参1形参类型2 形参2.....函数类型 函数名 形参类型1形参类型2.....1.3.2 函数调用过程在进行函数调用时系统将实参值对应地按位置次序对应传给形参是一种值的单向传递。2.变量三属性变量三属性类型作用范围存储类别类型定义作用范围根据位置分为内部局部外部全局存储类别auto static register extern2.1 类型类型名 变量名列表例如 int xyz2.2 作用范围局部变量:(或称内部变量定义在一个函数内部定义的变量为局部变量局部变量只能在它所在的函数内有效在不同的函数中可以出现同名的变量它们分别属于不同的变量。复合语句中定义的变量只能在此复合语句中有效所有形式参数都是局部变量 全局变量或称外部变量定义在函数外部定义的变量为全局变量全局变量的有效范围是在本文件内从定义该变量的位置开始到本文件的结束。全局变量可以在它的有效范围内被每个函数引用。 3. 在同一文件中若全局变量和局部变量同名局部变量屏蔽全局变量例代码语言cAI代码解释#includestdio.h int a,b; void fun() { a100; b200; } main() { int a5,b7; fun(); printf(%d%d\n,a,b); }2.3 存储类别--四种之一2.3.1 auto类别变量a. auto类别变量用完后释放所占用空间b.局部变量默认为auto类别无初始化时初始值为随机值c.使用时间短一般都为auto类别变量2.3.2 static类别变量a.static类别从定义到程序运行程序均占用存储空间。b.全局变量默认为static类别无初始化时初值为0。c.static类别变量只进行一次初始化。在做题的过程中static可以用方框圈起2.3.3 register类别变量a.register类别只能是局部变量才能被说明b.一般不能直接使用2.3.4 extern类别变量a.extern类别变量可以加大变量的作用范围b.两格说明格式格式1:定义同时说明类别存储类别 类型名 变量名格式2:分别定义说明类型名变量名存储类别 变量名例子代码语言cAI代码解释#includestdio.h //静态变量static main() { extern x,y; printf(%d,%d\n,x,y); } int x,y;3.预编译命令3.1 预编译命令文件包含include#include#include3.2 宏第一种无参宏定义格式#define 宏名 宏内容功能用一个指定的标识符宏名来代表一串字符如代码语言cAI代码解释#define PI 3.14.1592 #define N 10注意宏名我们一般用大写字母遵守用户自定义标识符命名古泽 如#define PI abcdefg#define可以在函数外定义也可以在函数内定义但该命令应该在单独一行上。 #undef命令可以提前终止宏名的作用域。在进行宏定义时可以引用已经定义的宏名进行层层置换在进行宏替换时必须先替换完所有的宏后再运算同时替换过程中不能乱加括号。第二种带参宏定义格式#define 宏名(参数列表) 宏内容如#define s(x,y) x*y2功能提供了一种更加灵活的替换方式。注意这种格式是原模原样替换就原模原样的替换然后再计算注(1)在定义有参宏时参数列表必须用一对小括号且小括号和宏名不能有空格(2)对有参宏名进行替换时需要将形参改成相应的实参并且注意分清形参和实参的对应关系。例子代码语言cAI代码解释#includestdio.h #define s(a,b) a*b main() { printf(%s%d,s(3,5)); printf(%s%d,s(32,57)); printf(%s%d,s((32),(57))); }代码语言cAI代码解释3*515,第一个结果是15 32*5720第二个结果是20 (32)*(57)5*1260,第三个结果是60拓展补充递归问题可以画图做