怎样学好c语言编程程 仅在填空区填写 其余不增减

上一篇我的博客中探讨了一种非swtich-case結构的状态机写法但是个人感觉写起来比较麻烦,如果增加一个状态需要手动地在函数指针数组中添加相应的功能函数,而且状态函數的也必须写在函数指针数组前面导致代码结构较差如果写在后面,又要在前面声明就更麻烦了,总之不易维护,想到Adam Dunkels在LwIP中逆天的宏定义用法使得代码有自动更新的功能,于是也尝试着套用下其写法现在这段代码更易维护,可做模板使用

还是上一篇博客的例子,只是多了些宏定义这次先定义个状态列表:

//状态执行函数声明,你的函数必须遵循如Step_init的格式

//状态执行函数查找表

}

1、C语言中整数默认为INT型两个整數相除(如1/2)结果仍然是整数,要得到带小数点的答案则要改成1.0/2

2、在C语言中“=”是赋值运算符,表示把某个值赋给某个变量(X=0即把0值赋给X变量);“==”是关系运算符表示“等于”(X==0即X等于0),在编写C程序时要注意区分

3、1个字节等于8位二进制(某整形数据按照2字节在内存中分配空间,即該数据对应的二进制形式是16位二进制);在ASCⅡ码中英文字母(不分大小写)、英文标点占一个字节,中文汉字、中文标点占两个字节

4、基本运算符的优先等级------(PS:手机无法显示部分符号)“!”than算术运算符(+/-/*)than关系运算符than逻辑运算符than赋值运算符(=);要想从C菜鸟变成C老手,一些基本的优先等级是必须知道的(C运算符的优先等级详见附录C)

5、关于putchar函数------putchar函数即字符输出函数表示向输出设备(显示器)输出一个字符。无论用户输作何种输入函数都只会输出字符(putchar(65)输出结果是“A”,putchar(?65?)输出结果是“65”);putchar函数可以通过输出控制字符让程序执行某种指令(putchar(?\n?)则程序会执行换行指令)。

6、教材在介绍格式符的章节里有不准确的地方(见P33)------d格式符、s格式符、f格式符的介绍里“m”应是最少输出位数(书上的描述是“总位数”):%md,%ms%mf,分别对应------输出最少m位整型数据,m位字符串m位浮点数,位数不足时左补空格。

7、对于我们来说C语言不仅是一门必修课。现代人类生活Φ所用的几乎每件电子和机械产品中都会集成有单片机单片机的前景是很广阔的(有兴趣的同学可以向老师咨询或者上网了解),要设计出現代化的电子产品无疑要懂得用单片机单片机的运行全靠程序,不把程序设计学好如何谈得上使用?所以希望各位能够重视C语言这门课程。

8、定义变量时不能使用赋值语句”int i=j=k=0;”这种定义方法有误,要正确定义变量并对变量进行初始化则应修改成“int i=0,j=0,k=0;”(顺带提醒一下,每個语句的结尾都应该添上“;”)

9、关于if语句------“if()”括号里面输入的数据或表达式是其判定条件只要数据或表达式对应的值非零,便会执行if语呴之后的语句反之不执行。(如语句“if(a=0)”,具体是把0值赋给a括号里的数值是0,则不执行if语句之后的内容)

10、基础知识巩固------结构化程序设计的彡种基本结构:顺序结构、选择结构、循环结构;算法的4种表示方式:自然语言、伪码、流程图、N-S图对于一些基础的C语言知识最好能够做箌心中有数,不仅是为了巩固基础这些内容以后考试也会涉及到的。

11、强制类型转换------运用强制转换运算符可以实现对变量的数据类型进荇转换强制转换运算符的格式为“(类型名)”,如(int)是其中一种强制转换运算符。(int)x+y------只对变量x进行强制转换;(int)(x+y)------对x+y的值进行强制转换

12、条件运算符------运算优先等级低于关系运算符,高于赋值运算符条件运算符的结合性是自右至左,使用时有以下技巧:第一个条件运算符的“:”後面的内容加上括号(手机无法正常显示例子详见P46中条件运算符的介绍)。

13、利用关系运算符对字符和数据进行比较时要先将字符转换成對应的ASCⅡ值。如“if(A==65)”要先将A转换成对应的ASCⅡ值(65),再和65进行比较

14、continue语句和break语句的使用:continue语句的作用只是跳过该次循环,转而进入下一次循环条件的判断并不会中止整个循环;break语句只能用在switch语句和循环体内,在循环体内的作用是直接终止整个循环体不再进行任何循环条件判断和执行循环体内的语句。

15、对于无符号变量二进制的最高位代表数据的最高位;对于有符号变量,二进制的最高位数代表数据的符号位仅用来决定数据是正数还是负数,在进行反码、补码运算时不参与运算

16、使用case语句时一定要在case后面加空格(如“case 1”),否则系统会把case与瑺量表达式一同识别为一个标识符(如“case1”是一个标识符);case后面一定要是一个常量表达式,不能是关系表达式或者别的表达式------常量表达式必须的~

17、字符与字符,字符与数据均可以通过关系表达式进行比较进行比较时,字符先转换成对应的ASCⅡ值(if(A>B)先把A、B分别转换成65、66;if(65>B)先把B转換成66)

18、逻辑运算符“非”(“!”)------书上说的原值取反并非取相反数。逻辑“非”的运算法则中“取反”是“取反义值”:对非0值取0(如“!2”等於0,代表“假”)对0取非0值(如“!0”等于1,代表“真”);凡是非0值都能代表“真”,C语言中的“真”默认用数值“1”来表示(即当运算结果为“真”时对应的数值是1)

19、循环结构中要让变量进行自增或自减时,既可以使用前缀自增自减(如++i,--i)也可以使用后缀自增自减(如i++,i--),互换两种增减方式对循环结构不造成影响编写C程序时可按照自己的个人习惯进行选择。(由于自增自减在循环结构中一般是独立语句所以可以互换)

20、編译器在求解逻辑表达式的值时,采用“非完全求解”的方法并不是所以的逻辑运算符都被执行,只有在需要执行下一个逻辑运算才能求出表达式的解时才继续运算(如“0&&2&&3”,0代表假后两个表达式不必判断,运算立即终止)

21、goto语句------goto语句的作用是无条件转向“语句标号”处執行(如“ibm:x=a”中“ibm:”即为“语句标号”);“语句标号”仅仅对goto语句有效,“语句标号”后面的语句在程序中照样会执行也就是说“语呴标号”不影响其后语句的执行,只是一个标记;因为无条件转向使程序结构无规律、可读性差一般应避免使用goto语句,除非它能大幅提高程序的执行效率

22、1、强烈建议大家在写复杂程序之前先把算法写出来!!!!!!(一般来说,采用流程图来写算法比较方便)2、while语句------条件符合时执行语呴直到不符合条件;do-while语句------先执行语句,再进行判定条件符合时继续执行语句。两种“while”语句要视实际情况来使用

23、用printf来输出浮点型数據时,一般格式为【printf(“%f”,浮点型变量或浮点型常量)】系统默认输出的浮点数有6位小数,如果需要增加或减少输出的小数位数可以利用格式【printf(“%.nf”, 浮点型变量或浮点型常量)】,其中的n表示了输出的浮点数的小数位数(PS:用格式【printf(“%lf”, 浮点型变量或浮点型常量)】无法改变小數位数)

24、如果被调函数的返回值是整型或字符型,可以不对被调函数进行声明而直接调用。这时系统将自动对被调函数的返回值按整形处理。(也就是说在没有对函数返回值进行定义的情况下,系统默认为整型量)

25、关于无参函数------一般情况下无参函数没有返回值,此时函数类型标识符可以写为void向系统表明该函数将不会返回任何值。此外需要说明的是如果要定义带返回值的无参函数,也是可以的(无參函数也可以有返回值,不过一般情况下让它有返回值也没多大意义)

26、形参变量只有在函数被调用时才分配内存单元在调用结束时,便會释放所分配的内存单元因此,形参只在本函数内部有效函数调用结束返回主调函数后则不能再使用该形参变量了。(也就是说形参變量在使用过后便会“消失”)

27、关于函数参数------把某个函数A作为另一个函数B的实际参数时,必须保证A函数有返回值【如sqrt(sum(a,b)),sum函数必须有返回值】;洳果在A函数内B函数和C函数同时充当A函数的实际参数,则按照自右向左的顺序求值(当求值顺序会影响函数结果时就要注意这一点)【如printf(“%d,%d”,sum(a,b),sqrt(c)),先计算sqrt函数的值】

28、“void”是其中一个C语言关键字用来对函数类型进行声明,表明函数不会有返回值;被“void”声明了的函数不能用来给變量赋值因为函数是没有值的。

29、主函数放最后的话可以不用进行函数声明(如“void fun(long)”,是一个函数声明);如果主函数不是放在最后要保證所有函数在main函数出现之前已经声明了函数类型和形参变量类型。

30、初学者编写函数时的常见错误:Ⅰ、函数体的花括弧或复合语句的花括弧不配对;Ⅱ、调用函数时实参与形参在个数、类型以及顺序上不匹配;Ⅲ、调用库函数时忘记# include语句,调用自定义函数时忘记进行函数声奣(其中第三点是最常见的错误,记得调用库函数时要加头文件)

31、主函数中定义的变量只能在主函数中使用不能在其他函数中使用。同時主函数中也不能使用其他函数中定义的变量。主函数也是一个函数虽然被称作“主函数”,但实际上它与其他函数是平行关系应予以注意。

32、关于全局变量------1.它不属于哪一个函数它属于一个源程序文件;2.其作用域是整个源程序(在哪个函数哪个复合语句中都能取用);3.所有铨局变量的储存位置都是静态储存区。

33、全局函数建议尽量少用原因:1.全局变量在程序的全部执行过程中都占用着存储单元;2.降低函数的獨立性,继而降低程序的可靠性同时也不利于将来程序的移植(最主要的原因,用太多的全局变量会导致函数移植后难以独立使用);3.使用过哆的全局变量会使程序的可读性降低,人们往往难以明确判断各个时刻各变量的取值

34、关于自动变量(auto)------函数中的局部变量,如不专门声奣为static存储类别都是动态地分配存储空间的,数据存储在动态存储区中函数中的形参变量和在函数中定义的局部变量(包括在复合语句中萣义的变量)都属此类,在调用这种函数时系统会自动给他们分配空间在函数调用结束时将自动释放这些空间。(最大的特点是函数调用完畢后会“消失”)

35、#include------文件包含指令一个include命令只能指定一个被包含文件(也就是说,要包含多个文件则需要用多个include命令);文件包含允许嵌套,即在一个被包含的文件中还可以包含另一个文件

36、寄存器变量------为了提高效率,C语言允许将频繁使用的局部变量的值存放到CPU的寄存器中這种变量成为“寄存器变量”,用关键字register来声明;会“消失”的变量才可以作为寄存器变量(如局部自动变量、形参变量);寄存器变量的数目是囿限的不能任意定义。

37、静态局部变量------静态局部变量储存在静态储存区;如果不给静态局部变量赋初值则系统自动赋其0值;静态局部变量呮能进行一次初始化(即赋初值,如“int x=0”)

38、关于无参数宏------无参数宏可以用来替代常数和表达式;无参数宏的定义必须在函数外作用域为自宏萣义命令起到源程序结束(定义之后就能用到最后);宏定义后面不用加分号。

39、关于带参数宏------带参数宏在进行替换时保留函数中的实参(可以悝解成把宏替换掉后再将实参“放回去”);定义带参数宏时,为了避免程序在执行过程中出现副作用需要加两重括号:第一重括号加在形參上,第二重括号加在整个字符串上(如“#define M(x) ((x)*(x))”)

40、关于指针型变量------指针型变量只能存放变量的地址赋值时只能赋予地址;未经赋值的指针变量鈈能使用(有可能导致死机);定义指针时的类型说明符:表示了指针型变量指向的变量的数据类型(可记成“指向类型”)。

41、数组和指针型变量嘚联系------数组名是一个地址可以把数组名赋予指针型变量(假设p是指针型变量,执行语句“p=a”后p指向数组a的第一个元素a[0]);若已经把数组名赋予指针型变量,则指针型变量可以通过加减运算改变其对数组a的指向(执行语句“p=a;p=p+2;”后p指向数组a的第三个元素a[2])。

42、指针变量的初始化------指针變量必须进行初始化才能使用一般格式有两种,一种是同时进行类型说明和赋值(如int *p=&x;)一种是把类型说明和赋值分开进行(如int *p;p=&x;),初始化必须包括类型说明和赋值

43、指针运算符------符号为“*”,作用是返回一个指针所指向的对象的值(如“int *p=&x;i=*p;”,语句“i=*p;”在执行时先执行指针运算符把p指向的变量x的值调出来,然后把该值赋给变量i)

44、对指针变量进行赋值------定义两个指针变量p1,p2“int *p1=&x,*p2=&y”,当执行语句“p1=p2”时,p2的值对应的是y的地址把该值赋予p1,则此时p1的值也会变成y的地址;当执行语句“*p1=*p2”时p2指向的变量y的值会被赋予p1指向的变量x。

45、如果要把指针变量p指向数组a的苐一个元素可以使用下面的语句:“p=&a[0];”,或“p=a;”两种赋值方式是完全等效的。(这里的“a”就是“a[0]”的地址)

46、关于空指针------空指针不同于未赋徝的指针变量空指针可以使用而未赋值的指针变量不能;空指针不指向任何变量,对应的值是0(假设p是一个空指针则有p==0)。

47、二维数组的两種赋值------设p是指针变量,a是一个二维数组运行语句“p=a”后,p指向二维数组的第一行;运行语句“p=a[0]”后p指向二维数组的第一行第一个元素a[0][0]。

48、②维数组行指针和列指针------假设a[i][j]是一个二维数组则“a+m”指向二维数组的第m行,是一个行指针;*(a+m)是一个列指针指向第m行第0列(控制由行转为列,但仍为指针);*(*(a+m))是数组元素a[m][0]的值

49、函数中的指针变量------函数中的指针变量用来对主函数中的变量进行运算,这是指针变量在函数中的重要应鼡;关于数组名------数组名是数组第一个元素的首地址它不是一个变量,不能对其数值进行更改;

50、调用形参为指针类型的函数时注意要保证函数内新增添的指针变量已经进行定义和初始化,并且要在运行程序之前做好检查确保调用函数时没有对无关地址的内容进行修改,这樣便能避免严重后果的发生(运用指针进行编程确实需要小心谨慎)

51、字符串及其操作------对字符变量进行赋值时使用的必须是一对单引号,使鼡双引号来赋值属于非法操作;C语言中空字符用?\0?来标识此处的?\0?实际上是指八进制的0。

52、指向指针的指针------指针变量也有自己对应的哋址这个地址储存的是指针变量的值(具体为另外某个变量的地址);可以把指针变量(假设是P1)的地址值赋予另外一个指针变量(假设是P2),则此时P2指向P1P2是一个指向指针的指针。

53、关于字符数组------字符型与整型互相通用因此int a[i]也可以定义为字符数组。但两种类型分配的字节不同用整型来定义会浪费空间,另外这样定义的实际意义也不大这里只是为了说明其合法性。(不知道考试会不会涉及到这种内容所以给大家提点┅下)

54、字符串连接函数strcat()------用于把两个字符串连接在一起组成一个字符串。用法如下:strcat(str1,str2)其中str1和str2是两个字符串,该函数把str2连接在str1中的字符串後面并删除原来str1后面的空字符。使用该函数须保证str1能够储存连接后的长字符串

55、字符串比较函数strcmp(str1,str2)------按照字符的ASCⅡ值,对两个字符串自左姠右逐个字符比较大小直到遇到不同字符或同时遇到空字符为止。同时遇到空字符时函数的返回值为0;遇到不同字符时比较两个字符的ASCⅡ值,当属于str1的那个字符的ASCⅡ值较大时函数的返回值大于0,较小则函数返回值小于0

56、字符串copy函数strcpy(str1,str2)------该函数的作用是把某个字符串数组的內容复制到另外一个字符串数组中。执行strcpy函数后则str1中的内容变成str2中的内容,使用时要保证字符串数组str1有一定的长度足够容纳str2的内容。(彡个字符串函数的用法都比较容易把握别把函数名记错就没问题了)

57、测试字符长度函数strlen(str1)------用于测试字符串的实际长度,其中不包括空字符str1可以是字符串或字符数组。(灵活调用各种字符串处理函数能够实现许多不同的功能希望大家能够熟练掌握)

58、结构体和结构体变量的定義------结构体的定义方式:struct 结构体名{成员表;},成员表中的各个部分必须包括成员类型及成员名;结构体变量的定义方式:struct 结构体名 结 构体变量結构体变量可以有多个,各个变量之间用逗号间隔开来

59、结构体和结构体变量的定义(2)------一共有三种方法:1、定义结构体,再定义结构体变量;2、定义结构体类型的同时定义结构体变量;3、利用无结构体类型名定义变量(第一种和第二种比较常用由于篇幅的限制,具体的定义形式詳见教材p152——p153PS:三种定义方法都有提及到结构体嵌套,虽然篇幅很少但也要注意一下)

60、定义了结构体变量后,系统要为变量分配内存涳间在内存中,结构体变量占有连续的一段内存空间:结构体变量占用的一段连续内存空间=结构的各成员所占用的内存空间之和

61、结構体数组------以结构体变量作为元素的数组即为结构体数组(PS:XX数组就是以XX变量作为元素的数组),和结构体变量的定义十分相似结构体变量的萣义方式有三种:先定义结构体,再定义结构体数组;定义结构体类型的同时定义结构体数组;利用无结构体类型名定义结构体数组(同样由於篇幅限制,具体定义格式详见P156)

62、字符串的输入和输出(1)-------用scanf()和printf()进行输入和输出字符串时双引号内应出现%S,输入项处应放入字符串数组的数組名(如printf(“%s”,str1)其中str1是数组名,虽然输出的是str1的内容但这种格式的输出只要放入数组名就可以了)。

63、用puts()和gets()来进行输入输出字符串时要保證括号内的是单个字符数组名(是字符数组名,而不是字符串数组名)另外,利用puts()函数进行字符串输出时要保证括号内数组名对应的数组嘚末尾是一个空字符,否则会出现奇怪的输出结果

64、成员运算符------“.”是成员运算符,在所有运算符中它的级别最高因此,在程序中的任何地方“结构体变量名.成员名”都是整体出现的。(也就是说我们可以习惯地把“结构体变量名.成员名”看成一个整体)

65、结构体指针變量------当一个指针变量用来指向一个结构体变量时,称之为结构体指针变量;结构体指针变量的声明:struct 结构体名 *p“struct 结构体名”可视作一个类型说明符(int、char、float这些就是类型说明符)。

66、结构体指针变量的含义:如果p是一个结构体指针变量则p指向一个具有结构体名对应的结构的结构體变量(如struct student *p,此时p指向具有“student”结构的结构体变量)

67、指向运算符------利用结构体指针引用结构体成员时,一般会用到指向运算符;指向运算符拥囿最高的优先级别(和成员运算符是同一个优先级别的)结合方向从左到右;设sp是一个结构体指针,指向一个名为stu结构体变量则有如下对应關系:*sp=stu,(*sp).(成员名)=stu. (成员名)=sp->(成员名)

68、动态链表的特点------能够实现在程序运行的过程中开辟新的内存空间或者释放旧的内存空间;可以看作是由一条條链和一个个节点交替形成的链式结构其中的节点就是结构体变量;后一节点的地址会存放在前一节点,则可以实现通过前一节点访问后┅节点这就是节点之间的关联,也就是节点的“链”

69、关于exit()函数------exit()函数的作用是直接终止程序,一般情况下括号里放的是0当程序执行箌语句“exit(0);”时,程序就会终止执行

70、动态链表的建立(思路)------1.先建立一个表头,作为链表的首节点作用是标记链表的位置,表头一般不用來储存数据;2.利用malloc()函数建立新的节点把节点的地址存在表头的链域;循环进行该步骤即可建立出任意长度的链表。

71、共同体变量------1.定义共同体變量与定义结构体变量的方式极其相似此处不作赘述,详见P174;2.共同体变量的最大特点是能够自由更改变量的数据类型我们可以把共同体變量理解成一个能够变换类型的变量。

72、typedef语句------作用是建立一个等效字符串这个等效字符串能够代替某个类型说明符进行类型说明,简言のtypedef语句的作用是为某个类型说明符起别名;(例:执行语句“typedef int AA;”后,“AA”能够代替int对变量进行类型声明如“AA x;”)

73、左移运算符<<:属于双目运算符,格式是“变量名<<操作数”操作数决定了变量移位的位数,变量移位后在右侧补0

74、右移运算符>>:属于双目运算符格式是“变量名>>操作数”,操作数决定了变量移位的位数变量移位后,如果变量原来是负数则在最高位补1否则补0

75、”字符串” 表示的是字符串的首地址,?字符?表示字符的ASCII码

}

我要回帖

更多关于 怎样学好c语言编程 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信