1、2022-4-172MoeCurlyLarry2022-4-1732022-4-1742022-4-175()yfx自变量自变量因变量因变量函数名函数名2022-4-1762235yxxnmzaxbyc一个自变量,一个因变量一个自变量,一个因变量两个自变量,一个因变量两个自变量,一个因变量2022-4-17711223344253816610852432539yxyxyxyxYAX自变量自变量因变量因变量2022-4-178()yfx一个变量一个变量二个变量二个变量N个变量个变量一个变量一个变量二个变量二个变量N个变量个变量自变量自变量与与因变量因变量的关系的关系2022-4-179集合A关系
2、集合B2022-4-17102022-4-1711MoeCurlyLarry2022-4-17122022-4-17132022-4-1714函数的返回值是通过函数的返回值是通过函数中的函数中的 return 语句获得的。语句获得的。2022-4-1715int Func(void) void Func(int i, float f) 2022-4-1716int Average(int x, int y) int result; result = (x + y) / 2; return result;main() int a = 12; int b = 24; int ave; ave =
3、Average(a, b); printf();数据传递执行顺序2022-4-17172022-4-17182022-4-1719int Average(int x, int y) int result; result = (x + y) / 2; return result;main() int a = 12; int b = 24; int ave; ave = Average(a, b); printf();数据传递执行顺序2022-4-17202022-4-17212022-4-1722当返回值为整型或者函数定义在函当返回值为整型或者函数定义在函数调用前面时,可以省略原型数调用前面时,
4、可以省略原型2022-4-1723int Average(int x, int y);2022-4-1724main()a();a 函数函数b();return;b函数函数return;2022-4-1725通过输入两个加通过输入两个加数给学生出一道数给学生出一道加法运算题加法运算题输入答案正确输入答案正确: right错误错误: : Not correct! Try again!2022-4-17262022-4-17272022-4-1728main() int a, b, answer; printf( Input a,b: ); scanf( %d,%d , &a, &b); answ
5、er = AddTest(a, b); Print(answer);do while (answer = 0);2022-4-1729main() answer = AddTest(a, b); Print(answer, chance); chance = 0; do chance+; while (answer = 0 & chance 3);2022-4-1730 srand(time(NULL); error = 0; score = 0; for (i=0; i10; i+) a = rand()%10 + 1; b = rand()%10 + 1; answer = AddTest
6、(a, b); Print(answer); if (answer = 1) score = score + 10; else error+; 2022-4-17312022-4-17322022-4-17332022-4-17342022-4-17352022-4-17362022-4-1737主函数主函数mainmain的的返回值规定为返回值规定为int。这个返回值在程序结束时。这个返回值在程序结束时送给外部。程序外部(如操作系统)可用这个值送给外部。程序外部(如操作系统)可用这个值一般用一般用返回返回0表示程序正常结束,其他值表示出错表示程序正常结束,其他值表示出错main以外的以外的函
7、数只有被调用时才会执行函数只有被调用时才会执行不允许调用不允许调用mainint main () /*一般写法一般写法*/ . . return 0;2022-4-17382022-4-17392022-4-17402022-4-17412022-4-17422022-4-1743程序区程序区静态存储区静态存储区动态存储区动态存储区形参、自动变形参、自动变量、函数调用量、函数调用的现场等的现场等全局变量、全局变量、静态变量静态变量2022-4-17442022-4-17452022-4-17462022-4-17472022-4-1748程序区程序区静态存储区静态存储区动态存储区动态存储区形参
8、、自动变形参、自动变量、函数调用量、函数调用的现场等的现场等全局变量、全局变量、静态变量静态变量2022-4-17492022-4-17505.5 预处理预处理C 语言源程序文件编译没有预处理命令的C 语言源程序文件预处理连接函数库目标程序文件可执行程序图 5.5C 语言程序的加工过程C程序编译的过程细分,可分为三步:预处理,编译,连接程序编译的过程细分,可分为三步:预处理,编译,连接。2022-4-1751 预处理程序预处理程序是是C系统的一部分,处理源程序的系统的一部分,处理源程序的预处预处理命令行理命令行,产生修改后的源程序。,产生修改后的源程序。“预处理预处理”在编译之前进行在编译之前
9、进行,根据源代码中的预处理指,根据源代码中的预处理指令,在令,在后台调整源代码后台调整源代码。编译器编译的都是经过预处理。编译器编译的都是经过预处理的代码。的代码。第一个非空白字符是第一个非空白字符是 # 的行就是预处理命令行。的行就是预处理命令行。预处理程序预处理程序包括以下几种:包括以下几种:1、文件包含命令、文件包含命令2、宏定义与宏替换、宏定义与宏替换3、条件保留命令、条件保留命令2022-4-17521、文件包含命令、文件包含命令 把指定文件内容包含到当前源文件把指定文件内容包含到当前源文件#include 形式形式1#include 文件名文件名形式形式2形式形式1用于包含用于包含
10、系统头文件系统头文件,预处理程序到指定目录找,预处理程序到指定目录找文件(通常指定几个系统文件目录)。这通常就是一个文件(通常指定几个系统文件目录)。这通常就是一个叫叫“include”的目录。的目录。形式形式2用于包含用于包含自己的文件自己的文件。预处理程序先在源文件所。预处理程序先在源文件所在的目录里找,找不到时再到指定目录中去找。在的目录里找,找不到时再到指定目录中去找。2022-4-1753处理过程处理过程: 在文件系统中查找指定的文件,如果找到,就用找在文件系统中查找指定的文件,如果找到,就用找到的到的文件的内容替换该命令行文件的内容替换该命令行。被包含文件里如有预处。被包含文件里如
11、有预处理行也会处理。理行也会处理。 前面实例都用包含命令,引进标准头文件(前面实例都用包含命令,引进标准头文件(.h 扩扩展名),它们在系统子目录里(目录名为展名),它们在系统子目录里(目录名为 include或或h),内容是标准函数原型、系统使用的符号常量定义),内容是标准函数原型、系统使用的符号常量定义等。等。注意:注意:写程序时一定要包含必要的系统头文件写程序时一定要包含必要的系统头文件。 包含这种文件相当于在源文件中写这些函数原型包含这种文件相当于在源文件中写这些函数原型,使编译程序能正确完成对标准库函数调用的处理。,使编译程序能正确完成对标准库函数调用的处理。2022-4-17542
12、、宏定义与宏替换、宏定义与宏替换#define开始,两种形式:开始,两种形式: 1)简单宏定义;)简单宏定义; 2)带参数宏定义;)带参数宏定义;简单宏定义简单宏定义,形式:,形式:作用作用: 为为宏名字宏名字定义替代,由整个定义替代,由整个替代正文替代正文构成。构成。 替代正文替代正文可以是任意正文序列,到换行为止。可以是任意正文序列,到换行为止。#define 宏名字宏名字 替代正文替代正文2022-4-1755预处理程序记录预处理程序记录宏名字宏名字及其及其替代替代。在源程序中遇。在源程序中遇到到宏名字宏名字标识符时,就用标识符时,就用替代正文替代正文替换。替换。宏展开宏展开/宏替换宏替
13、换。替代正文里的宏名字还继续展开。替代正文里的宏名字还继续展开。字符串不做宏字符串不做宏替换替换。2022-4-1756人们也用这种方式定义符号常量。人们也用这种方式定义符号常量。#define NUM 30替代正文可以写任何东西。替代正文可以写任何东西。若定义:若定义:#define SLD static long double程序中的:程序中的:SLD x=2.4, y=9.16;替换后变成:替换后变成:static long double x=2.4, y=9.16;#define NOSTOP while(1)预处理程序做正文替换,预处理程序做正文替换,替代正文替代正文可以是任何东西。
14、可以是任何东西。2022-4-1757带参数宏定义带参数宏定义,形式:形式:说明:说明: 宏名字与括号间不能有空格宏名字与括号间不能有空格,逗号分隔的标识,逗号分隔的标识符看作参数。替换正文为任意正文序列。符看作参数。替换正文为任意正文序列。 使用形式与函数调用类似(使用形式与函数调用类似(但本质不同但本质不同),以),以类似参数的形式给出宏参数的替代段,用逗号分隔,类似参数的形式给出宏参数的替代段,用逗号分隔,称为称为宏调用宏调用。举例:举例:#define min(A,B) (A)(B)?(A):(B)z = min(x+y, x*y);#define 宏名字宏名字(参数列表参数列表) 替
15、代正文替代正文2022-4-1758宏调用的替换分两步展开:宏调用的替换分两步展开:先用各实参替代宏定义先用各实参替代宏定义替代正文替代正文里的参数;再将代换的结果代入宏调用位里的参数;再将代换的结果代入宏调用位置。置。#define min(A,B) (A)(B)?(A):(B)z = min(x+y, x*y);预处理中将被展开为:预处理中将被展开为:z = (x+y)(x*y) ? (x+y) : (x*y);例如书例如书P179页的展开式页的展开式2022-4-1759注意注意:宏展开可能引起参数多次计算。如:宏展开可能引起参数多次计算。如:z = min(n+, m+); 展开后的形
16、式是:展开后的形式是:z = (n+) (m+)?(n+):(m+)替代正文各参数和整段应括起,避免出错。例:替代正文各参数和整段应括起,避免出错。例:#define square(x) x * x在特定环境下可能出问题,例如:在特定环境下可能出问题,例如:z = square(x + y);使用使用带参宏带参宏与与调用函数调用函数的意义不同。程序加工中在的意义不同。程序加工中在“当当地地”展开。程序执行中并没有调用动作,展开。程序执行中并没有调用动作,宏定义宏定义/调用中没有类型问题。一个宏能否使用调用中没有类型问题。一个宏能否使用/使用中使用中发生什么发生什么/能否得到预期效果,完全看展开
17、后的情况。能否得到预期效果,完全看展开后的情况。2022-4-1760使用宏定义应注意:使用宏定义应注意:带参宏的展开可避免函数调用开销,但使程序变长。带参宏的展开可避免函数调用开销,但使程序变长。复杂宏定义展开后出错很难定位。复杂宏定义展开后出错很难定位。应谨慎使用(尽量少使用)宏应谨慎使用(尽量少使用)宏。写宏定义的常见错误是在定义行最后写分号。该分号写宏定义的常见错误是在定义行最后写分号。该分号 将被代入程序,有可能引起语法错误。将被代入程序,有可能引起语法错误。宏定义从定义处起作用直到文件结束。宏定义从定义处起作用直到文件结束。一个文件里不允许对同一宏名字重复定义。一个文件里不允许对同
18、一宏名字重复定义。#undef取消已有定义:取消已有定义: #undef 宏名字宏名字2022-4-17613、条件保留命令、条件保留命令 预处理命令还有剪裁代码的能力,使某些代码仅在特定条预处理命令还有剪裁代码的能力,使某些代码仅在特定条件成立时才会被编译进可执行文件,可由以下命令组合实现件成立时才会被编译进可执行文件,可由以下命令组合实现。 #if #else #elif #endif#if/#elif要求一个静态整型表达式要求一个静态整型表达式另两个单独成行另两个单独成行作用是划出源程序中一些片段:作用是划出源程序中一些片段:条件成立时保留,否则丢掉条件成立时保留,否则丢掉根据条件成立与
19、否从两段中取一段根据条件成立与否从两段中取一段根据多个条件决定从多段中取一段根据多个条件决定从多段中取一段2022-4-1762条件应该是整数表达式,条件应该是整数表达式,0表示条件不成立,否则条件表示条件不成立,否则条件成立。常用成立。常用 =、!= 做判断。做判断。例子:例子:#if TESTprintf(. .);#endif例例5.5.3.12022-4-1763谓词谓词defined。使用形式:。使用形式:defined 标识符标识符或或 defined(标识符标识符)当当标识符标识符是有定义的宏名字时,是有定义的宏名字时,defined(标识符标识符) 得得到到1,否则得,否则得0
20、 #ifdef 标识符标识符 相当于相当于 #if defined(标识符标识符)#ifndef 标识符标识符 相当于相当于 #if !defined(标识符标识符)例例5.5.3.22022-4-17642022-4-17652022-4-1766)!(!kmkp2022-4-17672022-4-1768为程序运为程序运行所作的行所作的准备工作准备工作程序的主程序的主体功能体功能在退出前要在退出前要做的事情,做的事情,如打印结果如打印结果资源释放资源释放2022-4-17692022-4-17702022-4-17712022-4-17722022-4-17732022-4-17742022-4-17752022-4-17762022-4-17772022-4-17782022-4-17792022-4-17802022-4-17812022-4-17822022-4-17832022-4-17842022-4-17852022-4-17862022-4-17872022-4-1788