《C语言知识程序设计教学教案word版.doc》由会员分享,可在线阅读,更多相关《C语言知识程序设计教学教案word版.doc(33页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、-+程序设计语言一般分为机器语言、汇编语言和高级语言三大类。1机器语言 对于计算机来说,一组机器指令就是程序,称为机器语言程序。 2汇编语言 为了便于理解与记忆,人们采用能帮助记忆的英文缩写符号(称为指令助记符)来代替机器语言指令代码中的操作码,用地址符号来代替地址码。 3高级语言 机器语言和汇编语言都是面向机器的语言,一般称为低级语言。 例2.1 编写一个C程序,其功能是显示字符串“How do you do!”。其C程序如下:#include stdio.hmain() printf(How do you do!n);下面针对一般的C程序作几点说明:(1)一个完整的C语言程序可以由多个函数
2、组成,但必须包含一个且只能包含一个名为main的函数(主函数)。程序总是从main函数开始执行。(2)在一个C函数模块中,由左右花括号 括起来的部分是函数体,其中的语句系列实现函数的预定功能。(3)C程序中的每一个语句必须以“;”结束,但书写格式是自由的。 (4)#include是编译预处理命令,其作用是将双引号或尖括号括起来的文件内容读到该命令的位置处。 (5)在C程序的任何位置处都可以用/* . */作注释,以提高程序的可读性。2.2.1 整型常量及其变量的定义1整型常量 在C语言中,有3种类型的整型常量:基本整型常量、长整型常量、无符号整型常量。 在C语言中,不管是哪种类型的整型常量,都
3、可以用3种数制表示。 (1)十进制整型常量。 (2)十六进制整型常量。 (3)八进制整型常量。 2整型变量的定义 在C程序中,用于存放整型数据的变量称为整型变量。在C语言中,可以定义基本整型、长整型、短整型和无符号整型等4种类型的整型变量。它们的定义方式如下。(1)基本整型变量 定义基本整型变量的形式如下: int 变量表列;(2)长整型 定义长整型变量的形式如下: long int 变量表列;(3)短整型定义短整型变量的形式如下: short int 变量表列;(4)无符号整型定义无符号基本整型变量的形式如下: unsigned int 变量表列; 一个类型说明语句可以同时定义多个同类型的变
4、量,各变量之间用逗号“,”分隔。 用类型说明语句定义的变量只是说明了为这些变量分配了存储空间,以便用于存放与之相同类型的数据,在未对这些变量赋值前,这些变量中(即存储空间中)的值是随机的。 C语言允许在定义变量的同时为变量赋初值。 在为整型变量初始化或赋值时,C编译系统自动将被赋数据转换成与相应变量的类型一致。 由于各种整型变量所占的字节数有限,因此,它们所能存放的整数有一定的范围。 实型常量及其变量的定义1实型(浮点型)常量(1)十进制数形式(2)指数形式(科学记数法)2实型变量的定义在C程序中,用于存放实型数据的变量称为实型变量。在C语言中,实型变量有单精度与双精度两种。 单精度 floa
5、t 双精度 double 字符型常量及其变量的定义1字符型常量 n 换行 r 回车 b 退格 t 制表(横向跳格) 单引号(单撇号) 双引号(双撇号) ddd 13位八进制数所代表的ASCII码字符 xhh 12位十六进制数所代表的ASCII码字符 f 走纸换页 反斜杠字符2字符型变量的定义字符型变量的定义方式如下:char 变量表列;数据的输入与输出应包括以下几项: 输入(出)的设备 输入(出)的格式 输入(出)的内容格式输出函数 格式输出函数的一般形式如下: printf(*“格式控制”,输出表); 其中格式控制部分要用一对双撇号括起来,它用于说明输出项目所采用的格式。 1整型格式说明符(
6、1)十进制形式 (2)八进制形式(3)十六进制形式2实型格式说明符如果以十进制数形式输出实型数据,其格式说明符为 %f 或 %m.nf如果以指数形式输出实型数据,其格式说明符为 %e 或 %m.ne3字符型格式说明符 字符型数据的格式说明符为 %c 或 %mc (1)输出表中各输出项目之间要用“,”分隔。 (2)格式控制中的各格式说明符与输出表中的各输出项目在个数、次序、类型等方面必须一一对应。 (3)格式控制中除格式说明符外的其他字符将按原样输出。 (4)在输出格式说明符中,如果带有宽度说明,则在左边没有数字的位置上用空格填满(即输出的数字是右对齐)。但如果在宽度说明前加一个负号(),则输出
7、为左对齐,即在右边补空格。 格式输入函数格式输入函数的一般形式如下: scanf(“格式控制”,内存地址表);1整型格式说明符(1)十进制形式 用于输入十进制形式的整型数据。(2)八进制形式用于输入八进制形式的整型数据。(3)十六进制形式用于输入十六进制形式的整型数据。2实型格式说明符用于输入的单精度实型格式说明符为 %f 或 %e用于输入的双精度实型格式说明符为 %lf3字符型格式说明符用于输入的字符型格式说明符为 %c 或 %mc赋值运算赋值运算符为“”。赋值表达式为变量名表达式(1)在C语言中,“”为赋值运算符,而不是等号;(2)赋值运算符“”左边必须是变量名,不能是表达式;(3)赋值运
8、算符“”两端的类型不一致时,系统将自动进行类型转换。算术运算 在C语言中,基本的算术运算符有以下几个: 加法运算符(双目运算符),或正值运算符(单目运算符)。如xy,x。 减法运算符(双目运算符),或负值运算符(单目运算符)。如a3,x。 * 乘法运算符(双目运算符)。如3*x。 / 除法运算符(双目运算符)。如x/y。 % 模余运算符(双目运算符)。只适用于整型数据,如9%4的值为1,11%3的值为2等。关系运算在C语言中,基本的关系运算符有以下6个: 小于 小于或等于 大于 大于或等于 等于! 不等于结果只有两个:true 或者 false 执行int x2,y3;后表达式x(y3)的值是
9、( 1 )逻辑运算 在C语言中,逻辑常量只有两种:值非零表示“真”,值为零表示“假”。其基本的逻辑运算符有以下3个: & (逻辑与) 两个量都为真时为真(1),否则为假(0) | | (逻辑或) 两个量中只要有一个为真时为真(1),只有都为假时为假(0) ! (逻辑非) 一个量为真时为假(0),假时为真(1)自增与自减运算符 增1运算符“”和减1运算符“”是两个单目(只有一个运算对象)运算符,它们的运算对象只能是整型或字符型变量。 增1运算符是将运算对象的值增1;减1运算符是将运算对象的值减1。 假设定义变量 int a= 5;int b;前缀自增 b = +a;/ a=6 b=6后缀自增 b
10、 = a+;/ a=6 b=5sizeof运算符sizeof运算符有以下两种用法:(1)用于求得表达式计算结果所占内存的字节数。其一般形式为 sizeof 表达式(2)用于求得某种数据类型的量所占内存的字节数。其一般形式为 sizeof(类型名)逗号运算符 逗号“,”是C程序中常见的符号。 在C语言中,逗号除作为分隔符使用外,还可以作为运算符来使用,称为逗号运算符。 逗号表达式的一般形式为子表达式1,子表达式2,子表达式n在使用逗号运算符(逗号表达式)时,要注意以下几点: (1)逗号运算符是所有运算符中级别最低的一种运算符。 (2)一个逗号表达式又可以与另一个表达式(可以是逗号表达式,也可以不
11、是逗号表达式)连接成新的逗号表达式。 (3)在许多情况下,使用逗号表达式的目的仅仅是为了得到各个子表达式的值,而并不一定要得到或使用整个逗号表达式的值。 C语言中的宏定义有两种形式:符号常量定义与带参数的宏定义。 符号常量定义 在C语言中,允许将程序中多处用到的“字符串”定义成一个符号常量。在C语言中定义符号常量的一般形式如下:#define 符号常量名 字符串 由于C语言中的所有变量名、函数名等都使用小写字母,因此,符号常量名一般用大写字母表示,以便与C语言中的保留关键字相区别。 C编译系统对定义的符号常量的处理只是进行简单的替换,不作任何语法检查。 #define 是一个命令,而不是语句,
12、因此在行末不能加“;”,并且应独立占一行。 #define 命令一般应出现在程序中函数的外面,其作用域范围是从#define 符号常量名 字符串到#undef 符号常量名(或文件末)带参数的宏定义 带参数的宏定义的一般形式为 #define 宏名(参数表) 字符串 其中字符串中应包含在参数表中所指定的参数,并且,当参数表中的参数多于一个时,各参数之间要用逗号分隔。在使用带参数的宏定义时,应注意以下两个问题。(1)在使用带参数的宏定义时,一般应将宏定义字符串中的参数都要用括号括起来,否则经过宏展开后,可能会出现意想不到的错误。 (2)在使用带参数的宏定义时,除了应将宏定义字符串中的参数都要用括号
13、括起来,还需要将整个字符串部分也要用括号括起来,否则经过宏展开后,还会可能出现意想不到的错误。书写一个求最大值的宏定义# define MAX(a , b) (ab)? (a) ,(b)3.1 语句与复合语句 在C语言中,一个表达式后面跟随一个分号就构成了一个语句,这种语句称为表达式语句。 在C语言中,分号(;)是表达式语句的终结符,而不是语句之间的分隔符,也就是说,分号是表达式语句的一个组成部分,只不过它位于表达式的后面。 在一个函数体内部,由左、右花括号括起来的语句称为复合语句,它的一般形式为说明部分;语句部分;3.2 if 语 句If 语句的形式为 if (表达式) 语句这种选择结构的流
14、程图如图3.1所示。下面对if语句作几点说明:(1)if语句中的逻辑表达式(即条件)必须要用一对圆括号括起来。 (2)if语句后的语句可以是复合语句。 (3)一个if语句 最后需要强调的是,在使用if语句时,一定要注意逻辑表达式的正确写法,特别是在连续使用多个if语句时更要注意。3.3 ifelse结构 在C语言中,ifelse结构的语句形式为 if (表达式) 语句1 else 语句2下面对ifelse结构作以下几点说明: (1)ifelse结构中的语句1与语句2都可以是复合语句。 (2)在ifelse结构中,语句1与语句2都可以是空语句。 (3)在ifelse结构中,如果在else前面有多
15、个if语句,则else与最近的if配对。(4)如果有多个ifelse结构嵌套如下: if (表达式1) 语句1 else if (表达式2) 语句2 else else if (表达式n) 语句n else 语句n1则可简写成 if (表达式1) 语句1 else if (表达式2) 语句2 else if (表达式n) 语句n else 语句n1在ifelse结构中,如果语句1与语句2都是单一的赋值语句,并且都是给同一个变量赋值,则可以用条件运算符来进行处理。 下面对条件表达式作几点说明:(1)条件运算符优先级要比赋值运算符高。 (2)条件运算符的优先级比关系运算符与算术运算符都要低,因此,
16、条件表达式中的“表达式1”、“表达式2”与“表达式3”都不必用括号括起来。 (3)条件运算符的结合方向为“从右到左”。 在C语言中提供了一个直接实现多路分支选择的结构,称为switch结构,其一般形式如下:switch(表达式) case 常量表达式1: 语句1 case 常量表达式2: 语句2 case 常量表达式n: 语句n default : 语句n1 下面对switch结构作几点说明: (1)switch结构中的表达式、常量表达式1、L、常量表达式n必须是整型或字符型。这是因为,在switch结构中,其分支数一般是有限的,并且是离散的,因此,其表达式的值也应是有限的,且是离散的。 (2
17、)同一个switch结构中的常量表达式值必须互不相同,否则就会出现矛盾的现象,即对于“表达式”的同一个值对应多种执行方案,这是错误的。(3)在switch结构中,case 与 default 的顺序可以任意,各case之间 的顺序也可以任意。 (4)在执行switch结构时,当执行完某case 后的语句后,将顺序执行后面case 后的语句,直到遇 break 语句才退出整个switch 结构的执行。 (5)在switch结构中,如果没有default 且“表达式”值不等于任何case 后常量表达式的值,则直接退出switch 结构而转到其后的语句执行。例3.12 计算奖金。 当企业利润P等于或
18、低于0.5万元时,奖金为利润的1%;当0.5P1万元时,超过0.5万元部分的奖金为利润的1.5%,0.5万元以下仍按1%计算;当1P2万元时,1万元以下部分仍按前面的方法计算,超过1万元的部分其奖金按利润的2%计算;当2P5万元时,2万元以下部分仍按前面的方法计算,超过2万元部分的奖金按利润的2.5%计算;当5P10万元时,5万元以下部分仍按前面的方法计算,超过5万元部分的奖金按利润的3%计算;当P10万元时,10万元以下部分仍按前面的方法计算,超过10万元部分按3.5%计算。其中P由键盘输入,计算并输出相应的奖金数W。根据图3.5所示的流程图,用ifelse if结构写出C程序如下:#inc
19、lude stdio.hmain() float p,w; printf(input p: ); scanf(%f,&p); if (p0.0) w0.0; else if (p0.5) w0.01*p; else if (p1.0) w0.0050.015*(p0.5); else if (p2.0) w0.01250.02*(p1.0); else if (p5.0) w0.03250.025*(p2.0); else if (p10.0) w0.10750.03*(p5.0); else w0.25750.035*(p10.0); printf(w%fn,w);例3.14 求解一元二次方
20、程Ax2BxC0。相应的C程序如下:#include stdio.h#include math.hmain() double a,b,c,d,x1,x2,p; printf(input a,b,c: ); scanf(%lf%lf%lf,&a,&b,&c); if (a0.0) if (b0.0) printf(ERRn); else printf(X%fn,c/b); else if (b0.0) dc/a; if (d0.0) printf(X1%fn,sqrt(d); printf(X2%fn,sqrt(d); else printf(X1j%fn,sqrt(d); printf(X2j
21、%fn,sqrt(d); else if (c0.0) printf(X10.0n); printf(X2%fn,b/a); else db*b4*a*c; if (d0.0) dsqrt(d); if (b0.0) x1(bd)/(2*a); else x1(bd)/(2*a); x2c/(a*x1); printf(X1%fn,x1); printf(X2%fn,x2); else dsqrt(d)/(2*a); pb/(2*a); printf(X1%fj%fn,p,d); printf(X2%fj%fn,p,d); 4.1.1 当型循环结构当型循环结构的流程图如图4.1所示。while
22、循环实现当型循环结构的C语句形式为 while (表达式) 循环体语句 功能:当表达式值0时,执行循环体,执行完后继续判断表达式值,只有当表达式值0时才退出循环。例4.2 从键盘输入各学生成绩,并对90分以上(包括90分)的学生人数进行计数,直到输入的成绩为负为止,最后输出成绩在90分以上的学生人数。其流程图如图4.3所示。其中变量count为整型,用于对90分以上的学生人数进行计数。相应的C程序如下:#include stdio.hmain() int count; float grade; count0; scanf(%f,&grade); while (grade0.0) if (gra
23、de90.0) countcount1; scanf(%f,&grade); printf(count%dn,count);直到型循环结构直到型循环结构的流程图如图4.4所示。do_while循环do_ while循环的执行过程是,首先执行循环体,然后判断条件(即计算逻辑表达式),如果条件满足(即逻辑表达式值为真),则退出循环结构;如果条件不满足(即逻辑表达式值为假),则继续执行循环体。 实现直到型循环结构的C语句形式为do 循环体语句 while(表达式); 功能:先执行循环体,然后判断表达式值,若表达式值0,则再次执行循环体,如此循环,直到表达式值0为止。例4.3 计算并输出下列级数和:直
24、到某项的绝对值小于 为止相应的流程图如图4.5所示。其中f用于改变每一项的符号,因为这是一个各项符号相间的级数。相应的C程序如下:#include stdio.hmain() int k; double sum,d,f; sum1.0; k1;f1.0; do kk1;ff;d1.0/(k*(k1);sumsumf*d; while(d1.0e4); printf(sum%lfn,sum);当型循环结构与直到型循环结构的区别与联系 当型循环结构与直到型循环结构既有共同之处,又有区别。主要体现在以下几个方面。(1)在while循环中,其循环体可以一次也不执行(即执行while循环结构的一开始,其
25、条件就不满足)。 (2)不管是while循环结构还是dowhile循环结构,在循环体内部必须要有能改变条件(即逻辑表达式值)的语句,否则将造成死循环。 (3)对于有些问题既可以用while循环结构来处理,也可以用dowhile循环结构来处理。(4)不管是while循环结构还是dowhile循环结构,其循环体如果包含一个以上的语句,应以复合语句形式出现。C语言提供的for循环属于当型循环结构,其一般形式为for(表达式1;表达式2;表达式3) 循环体语句(组)它等价于下列的当型循环结构:表达式1;while(表达式2) 循环体语句 表达式3; 下面对for循环语句作几点说明: (1)在for语句
26、中,三个表达式中的任何一个表达式均可省略,但其中的两个“;”不能省略。 (2)下列两个循环都是死循环: for(表达式1;表达式3) 循环体与 for(;) 循环体 因为它们都没有用于判断循环是否结束的条件(即表达式2)。 (3)for循环本质上也是当型循环结构,只不过它对于事先可以确定循环次数的问题特别方便。 (4)在for循环中,循环体也可以是复合语句(即用一对花括号 括起来的语句组)。循环的嵌套 所谓循环的嵌套是指一个循环体内又包含了另一个完整的循环结构。C语言允许循环结构嵌套多层。循环的嵌套结构又称为多重循环。例4.6 计算并输出10以内(包括10)所有自然数的阶乘值。即计算1!,2!
27、,3!,4!,5!,6!,7!,8!,9!,10!。采用的方法是,对于10以内的每一个自然数分别求它们的阶乘值。其流程图如图4.7所示。显然,这是一个二重循环结构。相应的C程序如下:#include stdio.hmain() int n,k; double s; for (n1; n10; nn1) s1.0; for (k1; kn; kk1) ss*k; printf(%2d!%16.7fn ,n,s); break 语句C语言中的break语句有以下两个功能:(1)跳出 switch 结构;(2)退出当前循环结构,包括 while 结构、 dowhile 结构和for循环结构。cont
28、inue 语句 continue语句的功能是结束本次循环的执行,但不退出循环结构。 下面举两个例子来说明continue语句的使用。例4.10 输出100200之间所有能被7或9整除的自然数。相应的C程序如下:#include stdio.hmain() int n; for (n100; n200; nn1) if (n%7!0)&(n%9!0) continue; /*结束本次循环,继续进行下次循环*/ printf(%d n,n); 实际上,上述程序等价于#include stdio.hmain() int n; for (n100; n200; nn1) if (n%70) | | (
29、n%90) printf(%d n,n); 5.1.1 函数的概念 在C语言中,函数分为以下两种。 (1)标准库函数 这种函数用户不必定义,但可直接使用。例如scanf() , printf() , fabs() , sqrt() ,exp(),sin(),cos()等都是C语言中常用的库函数。 (2)用户自己定义的函数 这种函数用以解决用户的专门问题,一般由用户自己编写。例5.1 从键盘输入两个正整数m与n(mn),求 的值(即求 )。 其C程序如下:#include stdio.hmain() /*主函数*/ int m,n; int p(); /*说明本函数中要调用的函数p()是整型*/
30、 scanf(%d,%d,&m,&n); if (mn) printf(%dn,p(m)/p(mn); else printf(mn ! n);int p(k) /*计算阶乘值的函数*/int k; int s,i; s1; for (i1; ik; ii1) ss*i; return(s);下面对函数作几点说明: (1)一个完整的C程序可以由若干个函数组成,其中必须有一个且只能有一个主函数main()。 (2)一个完整C程序中的所有函数可以放在一个文件中,也可以放在多个文件中。 在编译命令行中键入各个函数所在的文件名(各文件名之间用空格分隔)。 在主函数中用 #include 语句将各函数所
31、在的文件包含进来。 (3)C语言中的函数没有从属关系,各函数之间互相独立,可以互相调用。 函数的定义 在C语言中,函数定义的一般形式为 类型标识符 函数名(形参表列) 形参类型说明 说明部分 语句部分 在定义C函数时要注意以下几点。(1)函数类型标识符同变量类型说明符,它表示返回的函数值类型。 (2)如果省略函数的类型标识符,则默认为是int型。 (3)C语言允许定义空函数。如dummy() (4)函数中返回语句的形式为return(表达式);或return 表达式;(5)如果“形参表列”中有多个形式参数,则它们之间要用“,”分隔。(6)C语言允许在形参表中直接对形参的类型进行说明。 函数的调
32、用函数调用的一般形式为函数名(实参表列)(1)函数调用可以出现在表达式中(有函数值返回);也可以单独作为一个语句(无函数值返回)。(2)实参表中的各实参可以是表达式,但它们的类型和个数应与函数中的形参一一对应。 (3)在调用函数中,通常要对被调用函数的返回值类型进行说明(一般在调用函数的函数体中的说明部分),包括函数类型、函数名和一对圆括号。 例5.2 下列程序的功能是计算输出一个圆台两底面积之和。#include stdio.hmain() double r1,r2; double q(); printf(input r1 ,r2: ); scanf(%lf,%lf,&r1,&r2); pr
33、intf(s%fn,q(r1,r2);double q(x,y)double x,y; double s; s3.1415926*(x*xy*y); return(s);但C语言规定,在以下几种情况下可以不在调用函数中对被调用函数作类型说明: 被调用函数为整型或字符型,自动按整型处理。 被调用函数的定义出现在调用函数之前。 在调用函数之前已经由别的函数(它可能也要调用该被调用函数)对被调用函数作了类型说明。 (4)C语言虽不允许嵌套定义函数,但可以嵌套调用函数。 形参与实参的结合方式1地址结合 所谓地址结合,是指在一个模块调用另一个模块时,并不是将调用模块中的实参值直接传送给被调用模块中的形参
34、,而只是将存放实参的地址传送给形参。 2数值结合 所谓数值结合,是指调用模块中的实参地址与被调用模块中的形参地址是互相独立的,在一个模块调用另一个模块时,直接将实参值传送给形参被存放在形参地址中。 例5.3 分析下列C程序:void swap(x,y)int x,y; int t; tx; xy; yt; return; #include stdio.hmain() int x,y; scanf(x%d,y%d,&x,&y); swap(x,y); printf(x%d,y%dn,x,y);在这个程序中共有两个函数。在主函数中分别为整型变量x与y输入数据,然后调用函数swap(x,y)。而函数
35、swap(x,y)的功能是实现变量x值与y值的交换。但在实际运行该程序时,如果从键盘输入x6,y8则输出的结果为x6,y8 即没有达到交换的目的。这是因为在主函数中调用函数swap()时,只是将实参x和y的值分别传递给了swap()函数中的形参x和y,但由于主函数中的实参x和y与函数swap()中的形参x和y在计算机中的存储地址是不同的,因此,在函数swap()中虽然交换了形参x与y的值,但实参x与y的值实际上没有改变,即它们没有被交换。由此可以看出,在形参与实参为数值结合的情况下,实参与形参在计算机内存中的存储地址不是同一个,因此,即使在被调用函数中改变了形参值,调用函数中的实参值也是不会被
36、改变的。 局部变量与全局变量1局部变量 在函数内部定义的变量称为局部变量。函数内部定义的变量只在该函数范围内有效,因此,不同函数中的局部变量可以重名,互不混淆。2全局变量 在函数外定义的变量称为全局变量除非十分必要,一般不提倡使用全局变量,其原因有以下几点: 由于全局变量属于程序中的所有函数,因此,在程序的执行过程中,全局变量都需要占用存储空间,即使实际正在执行的函数中根本用不着这些全局变量,它们也要占用存储空间。 在函数中使用全局变量后,要求在所有调用该函数的调用程序中都要使用这些全局变量,从而会降低函数的通用性。 在函数中使用全局变量后,使各函数模块之间的互相影响比较大,从而使函数模块的“
37、内聚性”差,而与其他模块的“耦合性”强。 在函数中使用全局变量后,会降低程序的清晰性,可读性差。动态存储变量与静态存储变量1用户程序的存储分配一般来说,用户程序在计算机中的存储分配如图5.1所示。其中: 程序区用于存放程序; 静态存储区是在程序开始执行时就分配的固定存储单元,如全局变量; 动态存储区是在函数调用过程中进行动态分配的存储单元,如函数形参、自动变量、函数调用时的现场保护和返回地址等。2变量的存储类型 数据类型:如整型(int)、实型(float)、字符型(char)、双精度型(double)等。 数据的存储类型:分为自动类型(auto)、静态类型(static)、寄存器类型(register)、外部类型(extern)。 例5.4 计算并输出15的阶乘值。其C程序如下:int fac(n) int n; static int f1; ff*n; return(f);#include stdio.hmain() int i; for (i1; i5; ii1) printf(%d!%dn,i,fac(i);下面对静态存储变量作几点说明: 形参不能定义成静态类型。 对局部静态变量赋初值是在编译时进行的,在调用时不再赋初值;而对自动变量赋初值是在调用时进行的,每次调用将重新赋初值。 定义局部静态变量时若不赋初值,则在编译时将自动赋
限制150内