c语言高效编程几招

2024-09-24

c语言高效编程几招(共10篇)

c语言高效编程几招 篇1

引言:编写高效简洁的C语言代码,是许多软件工程师追求的目标,本文就工作中的一些体会和经验做相关的阐述,不对的地方请各位指教。

第1招:以空间换时间

计算机程序中最大的矛盾是空间和时间的矛盾,那么,从这个角度出发逆向思维来考虑程序的效率问题,我们就有了解决问题的第1招——以空间换时间。

例如:字符串的赋值。

方法A,通常的办法:

#define LEN 32

char string1 [LEN];

memset (string1,0,LEN);

strcpy (string1,“This is a example!!”);

方法B:

const char string2[LEN] =“This is a example!”;

char * cp;

cp = string2 ;

(使用的时候可以直接用指针来操作。)

从上面的例子可以看出,A和B的效率是不能比的。在同样的存储空间下,B直接使用指针就可以操作了,而A需要调用两个字符函数才能完成。B的缺点在于灵活性没有A好。在需要频繁更改一个字符串内容的时候,A具有更好的灵活性;如果采用方法B,则需要预存许多字符串,虽然占用了大量的内存,但是获得了程序执行的高效率。

如果系统的实时性要求很高,内存还有一些,那我推荐你使用该招数。

该招数的变招——使用宏函数而不是函数。举例如下:

方法C:

#define bwMCDR2_ADDRESS 4

#define bsMCDR2_ADDRESS 17

int BIT_MASK(int __bf)

{

return ((1U << (bw ## __bf)) - 1) << (bs ## __bf);

}

void SET_BITS(int __dst, int __bf, int __val)

{

__dst = ((__dst) & ~(BIT_MASK(__bf))) | (((__val) << (bs ## __bf)) & (BIT_MASK(__bf))))

}

SET_BITS(MCDR2, MCDR2_ADDRESS, RegisterNumber);

方法D:

#define bwMCDR2_ADDRESS 4

#define bsMCDR2_ADDRESS 17

#define bmMCDR2_ADDRESS BIT_MASK(MCDR2_ADDRESS)

#define BIT_MASK(__bf) (((1U << (bw ## __bf)) - 1) << (bs ## __bf))

#define SET_BITS(__dst, __bf, __val)

((__dst) = ((__dst) & ~(BIT_MASK(__bf))) |

(((__val) << (bs ## __bf)) & (BIT_MASK(__bf))))

SET_BITS(MCDR2, MCDR2_ADDRESS, RegisterNumber);

函数和宏函数的区别就在于,宏函数占用了大量的空间,而函数占用了时间,

大家要知道的是,函数调用是要使用系统的栈来保存数据的,如果编译器里有栈检查选项,一般在函数的头会嵌入一些汇编语句对当前栈进行检查;同时,CPU也要在函数调用时保存和恢复当前的现场,进行压栈和弹栈操作,所以,函数调用需要一些CPU时间。而宏函数不存在这个问题。宏函数仅仅作为预先写好的代码嵌入到当前程序,不会产生函数调用,所以仅仅是占用了空间,在频繁调用同一个宏函数的时候,该现象尤其突出。 D方法是我看到的最好的置位操作函数,是ARM公司源码的一部分,在短短的三行内实现了很多功能,几乎涵盖了所有的位操作功能。C方法是其变体,其中滋味还需大家仔细体会。

第2招:数学方法解决问题

现在我们演绎高效C语言编写的第二招——采用数学方法来解决问题。

数学是计算机之母,没有数学的依据和基础,就没有计算机的发展,所以在编写程序的时候,采用一些数学方法会对程序的执行效率有数量级的提高。

c语言高效编程几招 篇2

1 指针

1.1 指针的特点

1.1.1 概念多,易混淆

指针这部分内容最突出的特点就是概念多,并且容易混淆。如变量的指针和指针变量,指针数组和数组指针,指针函数和函数指针等。

变量的指针是指基本变量的地址,而指针变量是专门存放地址的变量;指针数组是指数组中的每个元素均为指针变量的数组,而数组指针是指向数组的指针,教学内容中重点讲述了一维数组和二维数组中隐含或存在的指针以及用法;指针函数是指函数的返回值为指针,而函数指针是指函数的首地址。这些概念字面差别不大,含义却不同。

1.1.2 由指针引出的数据类型多

引入指针概念后,可以定义出许多新的数据类型。如:整型指针变量、字符型指针变量、实型指针变量;整型指针数组、字符型指针数组、实型指针数组;指向一维整型数组的数组指针、指向一维字符型数组的数组指针、指向二维整型数组的数组指针、指向二维字符型数组的数组指针等;除此之外,还有指针函数类型和函数指针类型等。众多的数据类型使用相互之间有差别,使用时应特别小心。

1.1.3 指针语法要求严格

指针内容的语法细节要求严格,如:(*p)++和*(p++),p为指针变量,仅括号位置不同,表示的含义就不同。前者表示p所指向变量的值加1,后者是“先使用后自加”,即先对p的原值进行*运算,然后使p的值自加。

指针的这些特点决定了指针的应用非常灵活。熟练的编程人员,利用它可以编写出颇具特色、高质量的程序,实现其它高级语言难以实现的功能。

1.2 指针的教与学

1.2.1 指针的课堂教学

目前,大多数高校采用先进的多媒体设备辅助教学,增强了课堂教学的新颖性和生动性,但是教学方式仍局限于传统方式———从语法角度按部就班地罗列语法知识,并且多媒体教学过多追求情节和画面,分散了学生的注意力,使学生对指针的理解过于肤浅,作题时不知所措。通过笔者多年的C语言教学实践证明:对于抽象复杂的指针概念,采用板书的教学方式,教学效果明显高于多媒体。一方面:教师在黑板上书写过程中,学生有充分时间理解和思考;另一方面:教师可以根据学生的反应,灵活调整授课内容或者改变教学方法。

针对指针概念多、数据类型多,易混淆的特点,在教学过程中,如果善于发现规律,对所学知识进行“罗列和总结”,那么将增强知识结构的系统性和完善性,同时将零碎的知识点串联起来,提高学生的记忆能力和辨别能力,进一步改善教学效果。以数组与指针为例,学习了指针之后,运用指针法同样可以表示数组元素,且该方法使目标程序占内存少,运行速度更快。

1.2.2 指针的学习

学习C语言时,学生对C语言基础知识掌握的熟练程度,直接影响指针的教学质量。以学习“指针变量”为例,首先应该清楚“指针变量”也是“变量”,因此具有“变量”的共同特点,即:变量值可以改变;任何变量名必须先定义,后使用等。其次,要明白“指针变量”与以前学过的“变量”的区别:指针变量的值一旦改变,表示指向不同的存储单元;在引用指针变量之前定义指针变量时,标识符即为指针变量名,与一般变量的定义不同的是:变量名前需加“*”;此外,在引用之前,还必须做到“先指向,后使用”,即将相应类型变量的地址先赋给指针变量,以确保指针变量有确切指向,这样才不至于造成指针变量的任意指向有可能破坏内存中的系统数据的严重后果。

另外,指针应用灵活,值得注意的语法细节也很多,如:p为一个指针变量,p++的含义,已不是简单的将p值加1,而是p+1*d,d=sizeof(p所指向的数据的数据类型)。这些细微之处直接影响学生实际分析程序,理解程序和编写程序的能力。为了能够正确掌握语法知识,培养实际的编程能力,在学习C语言的过程中,上机实践是必不可少的。学生根据教师指定的上机题目,在课前设计算法、编写程序,上机时对编写的程序进行调试、修改。总之,C语言是一门实践性很强的课程,只有不断上机摸索,才能熟练掌握并灵活应用。

2 C语言的高效编程

同一个问题解决的方法多种多样,因此,编写的程序就会多种多样,众多的解决方案中选择一个高效的解决方法,是编程人员必须具备的素质。

2.1 使用数学方法

数学是计算机之母,也是计算机的主要用途之一。没有数学的依据和基础,就没有计算机的发展,所以,在编写程序时,采用一些数学方法会对程序的执行效率有数量级的提高。

例如,用C语言编程求1~100之内的所有素数。我们通常的编程方法是:

该方法解决这个问题至少循环100次,最少用了100次判断。但是如果我们找出解决这个问题的规律,采用下面的算法就可以大大提高程序效率。算法如下:

这个简单的例子说明,在使用C语言编写程序时,可以更多的使用数学知识,最大限度的发挥数学的威力提高程序运行的效率。

2.2 使用位操作

数据的位是计算机程序中可以操作的最小数据单位。灵活的位操作可以有效的提高程序的运行效率。位操作一般应用在对一些整数的乘除运算上。

例如,如下的程序段:

对于数值8,即为2的3次方,所以语句i=257/8;可以写成i=257>>3;,前一语句调用了基本的除法函数,这个过程既有函数调用,还有很多汇编代码和寄存器参与运算,而后一语句仅仅是相关的汇编代码,因此更简洁、效率更高[2]。

2.3 嵌入汇编程序

汇编语言是执行效率最高的语言,在嵌入式软件的开发中,尤其在进行操作系统移植、驱动程序的开发时,程序员往往需要利用汇编语言来编写程序。这是因为某些和架构相关的代码必须使用汇编语言,另外一个就是为了优化代码性能,提高程序的运行效率。所以,为了获得程序的高效率,可以采用混合编程方法,即在C语言程序中嵌入汇编程序。

GCC为内嵌汇编提供了一个专门的关键词:asm(或者_asm_),其格式如下[3]:

上面的“汇编程序指令”就是实际的汇编语言指令;“输出操作数”建立汇编指令的输出清单;“输入操作数”是作为输入到汇编指令的操作数的C语言中的变量或表达式;“内嵌汇编指令使用的寄存器”是告诉C编译器,这段内嵌的汇编指令代码使用到的一些寄存器,以便于在C编译器编译C程序时避开这些寄存器。

下面的例子说明了上述汇编模板的用法:

这个例子是C语言语句”b=a”;的内嵌汇编语言语言。C程序中内嵌汇编是优化程序代码,提高程序效率的一个有效的手段。

2.4 使用指针

在解决数组问题的众多编程方案中,使用指针可以说是效率最高的一种。例如,有如下的实现给一个整形数组a赋值并输出数组中全部元素的程序段[1]:

1)下标法:

2)指针法:

对于上面的方法一,C编译系统是将a[i]转换为*(a+i)处理的,即先计算元素地址,因此用这种方法找数组元素费时较多。对于方法二,用指针变量p直接指向数组元素,不必每次都重新计算地址,像p++这样的自加操作是很快的,这种有规律的改变地址值的(p++)运算能大大提高执行效率。

3 总结

C语言是目前各高校计算机专业和相关专业所开设的一门重要基础课程,学好这门语言课是后续课程比如操作系统、数据结构等的基础。指针是C语言的重点和难点,其概念复杂、使用灵活的特点,使得大多数学生在学习过程中感觉难以掌握。在实际教学过程中,教师不仅要对C语言中的指针有深刻理解,而且要有丰富的教学经验,激发学生的学习兴趣。与此同时,教师更应该引导学生在C语言的学习过程中注重C程序的高效性,在日常编写程序时,自觉选择一种相对高校的编程方法。本文列举的提高程序效率的几种方法可供参考。

参考文献

[1]谭浩强.C程序设计教程[M].北京:清华大学出版社,2007:199-121.

[2]孙承爱,赵卫东.程序设计基础基于C语言[M].北京:清华大学出版社,2008:85-87.

c语言高效编程几招 篇3

关键词:C语言;编程技巧;应用

中图分类号:G642 文献标识码:B 文章编号:1002-7661(2014)24-002-01

C语言属于一种程序设计类语言,其使用在数据处理方面有突出作用,在很多的学习工作领域都有大规模的应用,像是软件开发、科研建设等都离不开C语言的利用。C语言编程,就是用C语言进行相应计算机代码的编写,C语言的学习,需要掌握一定的技巧,不然没有头绪的学习是得不到良好学习效果的,掌握了C语言的学习技巧,才能够更好的促进C语言的学习[1]。

一、C语言与C语言的优势

当下世界上使用范围最广,流行度最高的计算机编程语言便是C语言,要想良好的学习和使用C语言,必须加深对C语言的了解。C语言发源于上个世纪60年代,成熟在70年代,最近半个世纪的使用过程中,C语言表现了如下几种优势:第一,C语言简洁紧凑,使用方式灵活方便,且语法运用宽松不受限制,书写方式自由随意,结合了高级编程语言的结构性与实用性的特点,组成了一种全新式的有强大使用功能的编程语言;第二,C语言有广泛的应用层面,且可植性强,C语言在各种系统中都能够被兼容使用;第三,C语言的运算符丰富多样,各种数据结构类型的使用,除了C语言可以将各种复杂的数据运算完成外,还具有强大的图形功能;第四,结构式的语言特点分割了代码和数据,其中的程序表现层次条理清楚,后期的使用和维护工作便利,使用C语言可以访问物理地址[2]。从中可知,C语言具有强大的功能,因此在信息技术的领域中,C语言所占据的地位是非常高的。

二、C语言学习难度大的原因

因为C语言所具备的各种强大功能,因此人们对其的关注程度也越来越高,想要学会并且全面掌握C语言技术的人也越来越多。可是大部分在刚刚接触C语言的时候,觉得C语言过于枯燥乏味,学习了一段时间后都没有掌握到多少知识,也没有一个清楚全面的认识对于C语言,觉得十分的茫然。出现这种情况的原因还是因为C语言是一种高级语言,这种语言和面向对象的语言之间存在较大的差别,在C语言的学习过程中,学习者难以从中看到形象的画面,只能够在编程程序成功后,经过调试才可以看到效果。在编程的过程中,只要出现一点粗心错误,就会让整个编程无法成功调试,出现一些错误的现象,除此之外,C语言的使用过程中,包含了大量的算法与数据组成结构,这些没有任何的技巧,就是要死记硬背,所以很多学习者在遇到这些枯燥晦涩的问题时,就会丧失学习兴趣,降低学习效率和学习质量。

三、C语言编程技巧的应用

1、用空间换时间

例如对字符串进行赋值,方法有以下几种:

(1)基础方法:

#define LEN 32

Char string I[LEN];

memset(string 1,0,LEN);

ctrcpy(string 1,“this is a example”) ;

(2)方法2:

const char string2[LEN]=“this is a example”;

char*cp;

cp=string2;

从这个案例中可以发现,方法(1)与方法(2)在电脑上的执行效率是不一样的,第一种方法必须使用两个字符函数才可以完成,而第二种方法直接使用指针就可以完成了。但是第二种方法相比第一种方法灵活性欠缺,如果这个字符串有不断变化的要求,那么第一种方法就有很大的使用优势了,第二种方法要占用较大的内存,但是效率比第一种更高[3]。

2、位运算掌握

在利用位运算的时候,能够让代码变得更加的简洁,提升运算效率,让问题得到顺利解决。在所有的计算机程序之中,最小的数据单位就是位,无特殊情况的话,所有的数据运算和操作都可以使用“位运算”方式完成,从这里就就可以看出,在编程语言之中,“位”有多么重要了。“位”使用在C语言的运算过程中,可以提升工作效率,顺利的将更多难度大的问题解决。

3、C语言特有函数掌握

很多时候进行编程,都需要使用C语言的特有函数,函数不是一种数据,而是一种功能,每一个函数都能够执行一定的功能建设,而相对应的函数名称中也将函数的功能反映了出来。开展函数定义的时候,要求操作者包含名字、参数名、类型和函数返回类型的数据,编译过程中,数据库系统是之前被定义好了的,使用过程中只要通过#include这项指令,把各种相关的头文件包含在本文件当中就可以了。

但是不管在C语言编程过程中使用怎样的技巧,还是需要做到具体问题具体分析,以上各种技巧使用起来因人而异,整体是能够提升编程效率,在学习过程中使用会获得一定的成效,而降低学习的枯燥感,拓宽C语言的使用范围。

C语言的学习过程中,每一位学习者都应该对C语言的特性有充分的了解,学习并且掌握每一种编程技巧,学习好了C语言的编程技巧,可以帮助学生提升C语言的学习兴趣,让学生的学习目的性更强,提升学生的C语言学习效率与学习质量。

参考文献:

[1] 余 勍.王 捷.浅谈C语言编程技巧在C语言学习中的应用[J].信息通信,2013,07:108.

[2] 赵 黎.范君君.C语言编程技巧在C语言学习中的应用研究[J]. 信息与电脑(理论版),2014,09:252.

C语言面向对象编程学习笔记 篇4

1、在底层驱动函数前加static标识符的作用:

a:加了static后表示该函数失去了全局可见性,只在该函数所在的文件作用域内可见 b:当函数声明为static以后,编译器在该目标编译单元内只含有该函数的入口地址,没有函数名,其它编译单元便不能通过该函数名来调用该函数,这也是对1的解析与说明

2、底层驱动的封装模板

通常将存储类,显示类,AD-DA类的外设驱动函数封装为以下几个函数: Void Open(void);

此函数用于开启外设,通常函数体中包涵IO和外设的初始化 Void Close(void)此函数用于关闭外设,特别是一些在休眠下功耗很大的外设,可用mos管控制其Vcc的通断,以此达到降低系统功耗的目的

Void Read(unsigned int address,unsigned char *data[],unsigned int count)

此函数用于读取数据,参数分别为:address,地址,*data[],存放数据的数组,count,要读取的字节数

Void Write(unsigned int address,unsigned char *data[],unsigned int count)此函数用于写数据,参数功能与读函数中相似。

Void control(unsigned char cmd,unsigned char data)此函数用于控制外设的工作状态,如休眠,低功耗等等

3、命名规则

A、宏定义全部用大写

如:#define OLED_CS PBout(12)B、驱动函数名称大小写,并且动词放置在末尾如

static long _OLED_Close(void)C、结构体的名称,结构体名大写,变量名小写,“驱动”的首字母大写

如:struct OLED_DEVICE oledDevice;

4、关于外设的数据手册

c语言高效编程几招 篇5

编程对于很多计算机菜鸟来说,可能是一件很难懂的学问。但是其实,想要学会编程,只要你有恒心、有耐心,就一定可以实现。

首先必须要学会C语言,C语言相对其他的编程语言来说也是比较简单的。但是如果你想要成为一名出色的C语言程序人员,必须要经过长期的练习才行,要多看代码、多写代码,并根据实战的经验多思考,学习编程是一件很艰难的事情,很少人能够坚持下来。而C语言作为编程的基础性课程,更是需要广大的编程爱好者多注意才行。

C语言在计算机中的运用可以说是无处不在。可以这么说,任何精通计算机的人一般都是C语言的高手。而我虽然不是计算机专业的,但是仍然对于编程很有兴趣,C语言就是我学习计算机编程学到的第一堂课。如果没有C语言,就不能够学习系统操作、结构化数据和计算机编译等高等课程,如果你想要在计算机有建树的话,就必须要掌握C语言这门基本功。

c语言高效编程几招 篇6

李红志

程序的可读性、可扩展性、可复用性、易维护性、语法是代码的入门,算法是代码的灵魂。

第1章 编程常见错误

1.1、语法错误

1、错用函数数据类型,比如abs(x),x可能为16bit的值,如果为16bit的值,给出32bit的值就会出错。

2、内存越界访问

内存越界访问有两种:一种是读越界,即读了不属于自己的数据,如果所读的内存地址是无效的,程度立刻就崩溃了。如果所读内存地址是有效的,在读的时 候不会出问题,但由于读到的数据是随机的,它会产生不可预料的后果。另外一种是写越界,又叫缓冲区溢出,所写入的数据对别人来说是随机的,它也会产生不可 预料的后果。

3、结构的成员顺序变化引发的错误

在初始化一个结构时,老手可能很少像新手那样老老实实的,一个成员一个成员的为结构初始化,而是采用快捷方式,如:

Struct s { int l;char* p;};int main(int argc, char* argv[]){ struct s s1 = {4, “abcd”};return 0;} 以上这种方式是非常危险的,原因在于你对结构的内存布局作了假设。如果这个结构是第三方提供的,他很可能调整结构中成员的相对位置。而这样的调整往 往不会在文档中说明,你自然很少去关注。如果调整的两个成员具有相同数据类型,编译时不会有任何警告,而程序的逻辑可能相距十万八千里了。

4、栈溢出。

我们在前面关于堆栈的一节讲过,在PC上,普通线程的栈空间也有十几M,通常够用了,定义大一点的临时变量不会有什么问题。

而在一些嵌入式中,线程的栈空间可能只5K大小,甚至小到只有256个字节。在这样的平台中,栈溢出是最常用的错误之一。

1.2、编译错误 1.3、链接错误

第2章 编程知识

关键字valotile的作用是告诉编译器,不要把变量优化到寄存器里。

第3章 编程规范

1.1 整体结构

1、必须包含的两个文件:

“#include “std_inc.h”” “#include “std_defs.h””

2、一个完整的project需要有程序说明文档

3、需要有变量宏定义函数说明文档,包含变量规则命名。

4、需要有程序流程图

5、需要有硬件测试报告

6、需要有程序修改记录

7、要有软件时间控制分析

1.2 编程规范

1、定义宏定义按照功能模块来区分;

2、枚举型定义当宏定义来处理;

3、程序和数据要分开;

4、格式上要对齐;

5、空行要规范;

6、中断中调用的变量,一定要分析在计算过程中别的地方赋值是不是有非本身意义的赋值;

7、变量的意义要清晰;

8、程序要分层设计; 9、1.3 注释规范

1、变量和宏定义都要在定义的时候注释一下,作用是什么,单位,放大倍数。

2、用“#”标记需要问别人、需要改进的地方。

3、用“$”标记如果硬件改变需要进行变化的地方。

4、用“// XX”。

5、每个函数上面都要写注释;

6、程序段内不要太多的注释,多的话影响程序的可读性;

1.4 变量命名

1、变量名用小写

2、宏定义用大写

1.5 不建议使用全局变量的原因:

(1)全局变量在程序的全部执行过程中都占用存储单元,而不是仅在需要时才开辟单元;

(2)它使函数的通用性降低了,因为函数在执行时依赖于其所在的外部变量。如果将一个函数移到另一个文件中,还要将有关的外部变量及其值一起移过去。但若该外部变量与其他文件 中的变量同名时,就会出现问题,降低了程序的可靠性和通用性。在程序设计中,在划分模块时就要求模块的“内聚性”强、与其他模块的“耦合性”弱。即模块的功能要单一(不要把许多互不相干的功能放到一个模块中),与其他模块的相互影响要尽量少,而使用全局变量是不符合这个原则的。一般要求把C程序中的函数做成一个封闭体,除了可以通过“实参——形参”的渠道与外界发生联系外,没有其他渠道。这样的程序移植性好,可读性强。

(3)使用全局变量过多,会降低程序的清晰性,人们往往难以清楚地判断出每个瞬时各个外部变量的值。在各个函数执行时都可能改变外部变量的值,程序容易出错。因此要限制使用全局变量。

(4)如果在同一个源文件中,外部变量与局部变量同名,则在局部变量的作用范围内,外部变量被“屏蔽”,即它不起作用。

说明:使用全局变量的作用是增加了函数间的数据联系的渠道。由于函数的调用只能带回一个返回值,因此有时可以利用全局变量增加与函数联系的渠道,从而到到一个以上的返回值。

第4章 2011-4-22:程序的矩阵化设计思想

适用于嵌入式软件设计,无操作系统,软件结构较复杂的情况。

1.6 定义

最小时延原则:软件设计过程中,在不影响其他性能的情况下,应该让数据的产生过程和使用过程之间的时延最小。

需控变量:软件运行过程中,需要控制计算顺序的全局变量。

非需控变量:软件运行过程中,不需要控制计算顺序的全局变量,比如从总线引发的中断中获取的信号。

优化矩阵:在设计函数执行顺序时,用于记录函数和函数输出变量的矩阵。1.7 软件结构的矩阵化

程序上的分层设计。层与层之间有接口。矩阵化设计。全局变量的作用范围要有设定,不能从上到下都是一种变量。分层设计后,才比较容易处理指令冲突的问题,因为指令被执行之前会有对几种指令进行判断的操作。模块化是矩阵化设计的基础,模块作为矩阵的cell,同一个层面的作为一个row,程序执行一次,就是从顶层到底层一次,只不过每次可能走的trace不同。这个trace就是程序真正运行了哪些模块。

程序应该是从模块化、发展到分层、再到矩阵。

环境识别、驾驶意图识别、干预退出预估、1.8 函数执行顺序的矩阵化

适用情况:系统信号较多,全局变量较多,在一个控制周期内,相互之间有计算先后要求。同一层次的函数较多。全局变量只在一个函数中被赋值,在多处被调用。

全局变量分为需控变量和非需控变量。

该方法是对某一层的函数进行执行顺序的设计 1.对每一个函数进行编号;

2.建立需控变量集:将每一个函数的输入全局变量和输出全局变量中的需控变量放进需控变量集。3.对需控变量集中的每个元素编号;

4.建立每个函数的输入需控变量集和输出需控变量集,变量集用需控变量集中元素编号表示;

5.逐个将函数添加至优化矩阵,每添加一个函数,调整优化矩阵,直到所有函数添加完成。得到每个函数的可存放域。

6.根据最小时延原则,调整每个函数到最优位置。7.输出可行的函数序列。第5章 编程经验

1.9 程序设计思想 控制时序的设计思想: 程序分层的设计思想: 程序的矩阵式设计思想; 变量的集中处理思想; 变量自衰减的处理思想;

估算变量的自衰减。估算变量时,由于只有满足估算条件才能进行估算,而估算条件不是持续成立的,所以只能在某些点进行估算。没有进行计算的地方,该变量就要随时间衰减,并且要给出一个health指标,表明这个被估算值的可信度。

干预退出预估的处理思想;

1.10 【2010-12-5】

1、能从CAN上获取的信号要从CAN上获取,比如发动机转速、发动机输出转矩、加速踏板位置(不知道还有用没了)、节气门开度(不知道还有用没了)、传动比(或者说档位)。

2、我觉得用115200,10ms传出100个byte没什么问题。这样的话,B+S的采集主要作用就在于同步一下压力,方向盘、横摆等信号用更高的频率采集,确认一下单片机的处理是否达到精度。

3、变量命名的规范化。全局变量中的temp,写成s32temp1,局部变量的temp,写成temp1s32.感觉不怎么好,但是总要区别一下的。

4、abs(x);的函数原型是int abs(int x)

5、尽量避免一个变量在不同程序段被幅值;

6、中断中用到的量,要小心在程序外会不会有非本身含义的短时间赋值;

7、一段代码尽量不要超过100行;

8、全局附着比局部复杂要复杂;

9、任何一段代码,要做到能用1句话描述;

10、【2011-7-4】

代码变成各种意义明确的节的优点:

1、高可靠性:每段很小,就更容易做到确认代码不会出问题,更能确认该段指令是千锤百炼的,绝对可靠的;

2、可维护性强:由于每段很小,很容易看懂,调试及修改都更方便;

3、可扩展性强:如果某一种计算有问题了,只用替换或修改某一小段,而不用到处找需要改哪些地方;

4、可复用性强:对某些小段,可能多个地方都可以用到,不用在不同的地方写很多次;

5、结构清晰:每一小段意义明确,程序结构、层次、调用关系、数据流等都更清晰;

6、可读性强:由于结构清晰,增加了可读性,另外结构清晰了,就容易写清楚注释,也增加了可读性;

7、函数无条件执行的优点:

1、结构更清晰:不用考虑是否执行了;

2、数据流更清晰:一个新的计算量由哪些变量得到,传递关系更清晰;

3、函数的模块化更好:能让函数无条件执行,表示该函数具有更高的独立性,也就是模块更完整,与其他代码的耦合程度更低,迁移更方便;

4、程序清晰之后,程序结构简单,从而增加可靠性;

5、集中处理的优点:(集中处理是只,如果一个变量的计算,在不同条件下,算法不同,那么把条件汇总到一起,在一段代码处处理这个变量)

1、结构清晰:一个变量的计算只出现在一个位置;

2、分散处理会造成同一个值在一次运算周期重复计算,后面的计算结果覆盖前面的计算结果,从而难以控制数据流;

3、【2011-7-5】

1、ESP方式的减压和泄压:开关控制方式下,两者没什么区别;

2、ABS方式的减压:减压速率和ESP减压方式差别很大;远小于ESP泄压速率,近似1/2关系;

3、Bosch 8.1的HCU,保压时有个大约90Hz的噪声,和王伟玮讨论了一下,基本上可以理解为那就是当时电机转动频率;

【2011-7-6】

1、在举升机上,两前轮确实会有转速差,并且转速差可能越来越大;

2、阀的端口,烧程序时的状态确认;没有高电平的;

3、粗略来讲,泄压速率正比于轮缸压力?

4、轮缸制动液净进入量和轮缸压力什么关系?在常用的范围内,大概是正比关系;

5、制动轮缸制动液液量增大了,谁变形了?制动盘、摩擦块、制动钳,还有谁?那个变形大?是不是制动钳>摩擦块>制动盘(最大也就0.1mm),6、主动增压时,进油速率基本恒定。HCU中的柱塞泵效率大概50%,好点儿能到60%;轮缸压力大,效率可能稍微高一点儿;轮缸压力大,电机转速稍微低一点儿。

7、【2011-7-8】

1、大型的复杂的程序,用面向对象编程效率要高得多;单就变量的private和public设定而言,就会减少很多变量赋值的误操作,相当于自动添加了一种自检验机制;其他还有很多优点。

2、应该把每个函数都做一个更新记录。这种更新记录怎么能做到比较容易看到上次的状态呢?难道只能把不同状 态都记录下来看的时候再对比?

3、【2011-7-9】

1、轴距和FMVSS126的A值之间的关系,基本上只轴距减小10%,A值减小3%(尊驰在CarSim中的仿真结果)。2DOF理论上应该成比例改变的,实际上可能悬架、轮胎的柔性有影响。

2、尊驰和C118在CarSim中仿真的A值大概都是31deg。

3、.c中的函数,必须在.h中声明,不是为了能被调用,还是为了比较直观地看到在这个.c文件中定义了哪些函数;

4、单片机上,除0,会怎样?

经测试,初步结论:正值/0 = 0xF*F,负值/0 = 1

5、坡道TCS之所以困难,就在于压力估算的偏差影响对坡度的识别,压力的持续控制也比较困难;

6、坡道对前轴载荷几乎没影响。cos(15deg)= 0.985

【2011-7-13】

1、任何一个条件执行的函数,都涉及到不满足条件时不执行了,它计算的变量清零,还是怎么处理。条件选择,都是选取一种处理方法,那么必须对任何一种处理都有对应的方法。

2、条件运算的函数改变的变量,函数不运行时也需要对变量进行赋值;函数在程序中的作用,就是为了给那几个变量赋值,不运行了,就要用其他方式赋值;

3、先分好层次,定义清楚变量和函数,画好框图再写程序;

4、定义文件之间的接口,函数之间的接口;

【2011-7-29】

1、数据后处理中用数据组合成控制信号,是不靠谱的。组合生成一些信号比较靠谱。

【2011-8-12】

1、程序要写到什么样才算好?多一个字则太多,少一个字则太少,天衣无缝,完美无暇,千锤百炼,炉火纯青。

2、一群人,怎么才能做好一个程序?首先定义清晰,规则明确,不能越俎代庖,每个人有不同的权限去维护不同的代码。每个人都要遵守其中的规则,不守规则的那个人就是系统的bug。

3、虽然说程序是调出来的,但是还是应该尽量写的时候就写完善,不能写得一塌糊涂而等调试去解决问题。写的时候,关注的只是那么几十行,而找bug的时候,关注的可是几千行,这效率能一样么?

4、大程序设计首要原则,降低各部分耦合度。

5、如果每个人负责几个文件的话,就不要轻易定义全局变量了,要尽量使用静态全局变量(作用域为本文件)。定义全局变量要先看全局变量库,并建立并进行登记。

6、以前程序很大的一个问题就是层次没分清,从而耦合度高,混乱。

7、格式上,所有的一块儿逻辑前面要有空行,比如if之类的。

8、定义一个新变量前,先检查一下是否已存在这个变量名。

9、函数中间尽量不用return,结构混乱。

10、减少调用层次;

11、程序的本质是什么?数据流;

12、函数的作用是什么?计算数据;

13、写程序的本质是什么?用矩阵化方式决定数据流的运行;

14、为什么要分层?降低耦合度;

【2012-2-5】

1、把OBJ中的一段,ID中的一段儿留给调试。也是分层的概念。

c语言高效编程几招 篇7

关键词:C语言,编程技巧,学习,应用

随着计算机技术不断发展, 计算机编程显得愈加重要。C语言作为计算机编程中使用最为广泛的语言之一, 同样也是语言编程领域中的重要代表。其主要特点分为两点:一是高级语言;二是低级语言, 即能够通过系统软件进行编写, 同时也能够通过应用软件进行编写, 可以说C语言的应用范围极为广泛, 是计算机编程中的主流语言之一。但C语言在学习过程中存在一些难度, 需要学生对C语言有一定理解, 这样才能够更好地学习C语言、掌握C语言。

一、C语言学习困难的主要因素

由于C语言的优势非常明显, 在计算机长期发展中, 对C语言编程的重视程度越来越高, 并且职业学校与高校都开设了C语言编程专业, 学习C语言的学生也不断增加。但是, 在C语言的实践学习中, 很多学生认为C语言学习非常枯燥、乏味, 使学习效率低下, 对C语言的基本内涵与技术没有一个明确的认识, 即使学习一段时间后也很难独立进行简单的编程。究其根本原因, 是由于C语言是一种高级语言, 并且与其他语言有着较大的差异性, 在日常学习中无法直观地感受到相应的知识画面, 只有通过C语言编程之后, 再进行一定的调试, 才能够直观看到编程效果。如果学生在编程过程中稍有一丝纰漏, 就会致使编程错误, C语言编程可以说是“牵一发而动全身”。

与此同时, C语言中存在诸多数据结构与算法结构, 这些知识点只能通过机械式记忆, 至今也无法找出很好的记忆方法, 使学生在背诵繁杂的算法过程中会容易遇到障碍或产生混淆。正因如此, 才会让学生感到C语言非常枯燥、乏味, 极大地降低学生学习兴趣, 使学生在学习过程中对C语言的学习逐渐丧失主观愿望, C语言学习质量与效率止步不前, 无法很好地完成教学目标。

二、C语言编程技巧在C语言学习中的应用

(一) 指针掌握

在C语言编程学习过程中, 学生要充分掌握指针知识, 这也是实现C语言编程的重要环节。正确应用指针能够帮助学生有效地解决一些相对比较复杂的C语言编程问题。在C语言学习中, 指针是一种特殊变量, 其主要包含三大要素, 即指针名称、指针类型、指针数值。在通常情况下, 指针名称与变量名称是相同的, 两者的主要区别在于数值与指针类别层面上。除此之外, 指针不仅能够表示数组, 同时也能够作为函数的残数返回值。

(二) C语言特有函数

C语言作为一种高级语言, 其内部构成也是非常复杂的, 需要学生能够正确掌握C语言特有函数, 也可以说C语言特有功能。可以说在一般情况下, 每一个C语言函数都能够代表、实现一定的C语言功能, 同时每个函数的名称也能够反映出其功能。在给函数进行定义的过程中, 应该包含函数的名字、参数、类型、返回值类型等。其中, 在编程过程中, 函数数据库会给予函数一个系统名称, 在正式应用过程中, 只需要将指令 (#include) 把相关的头文件包含在本文件中即可。

(三) 算法技巧

在C语言学习过程中, 学生必须要掌握一定的算法技巧, 同时算法也是C语言编程的重要组成部分。通常情况下, 算法可以通过自然语言的形态表示, 也可以采用流程图的形式来表示。在应用流程图的过程中, 要求学生能够灵活、熟练地掌握一些常用流程符号。学生想要更好地掌握算法技巧, 一些基础的数学知识是非常重要的, 同时也比数学基础较差的学生要掌握得更快。所以, 在算法教学过程中, 教师可以适当融入一些数学知识, 从而提高C语言编程效率与质量。

(四) 位运算与文件

位运算可以说是C语言编程中的一大特色, 位运算在其他语言编程中是不具备的。二进制是位运算的主要针对对象, 之后再通过输入数值进行一系列的运算。例如按位、位与、取反等算法, 都是位运算中的基本算法。除此之外, 文件在C语言编程时也是十分重要的, 同样也是必不可少的。文件主要包含数据文件以及程序文件, 通过文件能够让数据查询更为便捷, 能够有效提高查询效率。可以说C语言编程的效率性, 是学习计算机编程的重要目标之一。所以, 学生必须要掌握好位运算相关的技巧与方法, 以及对文件知识更加得心应手, 在实践操作中不断自我反省、自我发现, 不断挖掘行之有效的编程方法, 从而提高学生的C语言编程技能。

C语言作为当代主流编程的代表语言之一, 在C语言应用范围非常广泛的同时, 也带来较为困难的学习难度。但是在实际学习过程中, 仍然可以挖掘一些学习方法与技巧, 来降低C语言的学习难度, 从而提高学习效率, 为社会提供更多的C语言编程人才。

参考文献

[1]段煅.C语言编程技巧在C语言学习中的应用[J].电脑编程技巧与维护, 2012, 7 (20) :97-104.

c语言高效编程几招 篇8

【关键词】高校教学;C语言;教学策略

【分类号】G642;TP312.1-4

C语言编程是一门兼具高级编程语言以及汇编语言共性的编程语言,应用广泛,不仅适用于编写各种工作系统程序,还可作为各种智能化程序设计语言。C语言编程过程中不依靠硬件,因此具有较强的实用性。当前C语言成为各大高校必开设的教学课程,学习好C语言后能够有效提升学生的竞争力,对学生就业有重要帮助,C语言教学过程中可结合其实际运用进行教学创新,提升教学效果。

1 教师在C语言编程教学中应注意的问题

计算机技术在未来社会的重要性不言而喻,现今C语言已经普及到各大高校教学中,为高校培养综合型人才提供有效途径。社会对计算机技术人才需求不断增加,无论是否计算机专业学生都需要掌握一定基础编程语言,C语言作为众多编程语言的代表成为高校的首选。学生学习好C语言编程不仅有利于拓宽个人知识面,还能够提高个人求职能力。教师在C语言教学过程中必须注意以下几个问题。

1.1 教学中强调C语言编程重要性

C语言并非高深编程语言,若在学习中找到学习技巧便能够快速入门。然而对于大多没有计算机编程语言基础的学生而言C语言如同无字天书般无法捉摸。一些学生在刚开始学习C语言时往往觉得课程难度太大而无法持续跟进,产生放弃学习的念头。学生初学C语言时往往无法了解C语言基础构建,很多学生仁威C语言构建过于复杂,而VFP等编程语言学习起来更加容易,也能够实现C语言的一些功能。教师应该让学生摒弃这种片面想法,介绍C语言相比于其他语言具备的独特优势,例如C语言是实现人工智能的基础,二其他语言在应用上过于片面等。初期学习C语言遇到各种困难时必然的,只要坚持不懈必然会取得骄人成绩。因此教师在教学中必须向学生强调C语言的重要性。教学前应该让学生对C语言有初步了解,向学生大致介绍C语言组成框架,并将其和其他编程语言的练习区别进行初步讲解,加深学生对C语言的第一印象。

1.2 利用VC程序展开教学

VC是计算机教学中比较先进的教学软件,全程为Visual +6.0,由微软公司开发,在应用上具有一定灵活性。相比于其他教学软件,VC具有独特优势,但若想熟练掌握VC却有相当难度。教师在教学中使用VC展开教学能够有效提升教学效果,该软件具备的WIN API方式以及MFC方式能够有效激发学生的学习兴趣,从而变学生被动学习为主动学习。

2 教学中提高学生C语言编程能力的教学策略

2.1 突出教学重点,明确学习任务

教师在教学中应该让学生带着目的学习。相对而言C语言是一门形式较为新颖的学科,学生在教学中往往容易迷失学习方向,因此教师在教学前需让学生了解本节课教学重点,学生了解终点后便能够在学习过程中有针对性吸收精华知识。教师在教之初应让学生明白学习C语言的关键之处在于灵活掌握并运用32个常见字以及常用库函数等知识。其次C语言教学并非仅靠教师讲解便可完成教学任务,整个教学过程需要学生参与,教师在教学过程中可以根据教学内容罗列出关键知识点并注明学习先后顺序,在教学过程中采用循序渐进引导方式,让学生掌握各关键知识点,最后将知识归纳在一起,形成系统性知识链。例如在进行signed以及long等程序整理数据知识教学时可首先提高学生该部分基础知识的掌握,在此基础上通过实题演练,通过电脑进行编程,让学生直观这些函数实用性。对于教学中一些教学难点,教师可以在教学中将其穿插于其他知识点反复讲解,加深学生对知识难点的理解,重复教学。

2.2 采用现代教学方法提高教学质量

随着科学技术不断发展,一些科技转变为教学辅助手段渗透到日常教学中,例如多媒体技术已经成为各大高校主要教学手段,因此教师在教学中可以借助这些现代教学手段提高教学质量。例如可以在教学中采用电子白板教学。C语言编程教学常见的例题有三种,分别为找错题、填空题、编程题,这三种类型例题也是当前C语言考试必考题。教师可以借助电子白板将这三种题型展示出来,并让学生在电子白板上自由书写,通过电子白板的支持能有效提高教学效率,免去书写习题题目的时间,同时该种教学方式具有一定人性化,学生可以在白板上通过书写方式展开练习,是学生最为熟悉的演练方式。通过现代教学技术还能够促进教学方式多样性,学生在教学过程中更为直观接触到C语言相关知识内容,便于快速吸收并消化知识点,为后续学习扫清障碍。

2.3 教学中避免出现概念混淆

C语言中含有大量概念性知识,对于初学者而言若容易出现概念混淆的情况。因此教学过程中教师必须强调学生注意对新知识新概念的理解,对于相似概念一定要从这些知识点不同之处展开记忆,把握知识体系。教师可在教学中对一些知识点进行系统性归纳总结,将容易混淆以及难以理解的知识点放在一起进行比较,让学生从根本上明白这些教学内容之间的练习和区别。例如在C语言中具有相同概念的知识就有循环结构以及分支结构,相似概念有指针和指针运算,教师在针对此类知识教学时须注意教学方法,避免学生走入学习盲区。

2.4 借助计算机网络加强学生自主学习能力

教师不仅需要在课堂教学发挥其作用,还需将其作用延续至课后,学生自学过程中由于缺少教师的支持,自学难以展开,效果不佳。教师可以利用网络平台向学生提供教学知识点以及教学视频,让学生在课后能够展开自主学习。其次教师可利用现代通讯工具和学生展开交流,学生有问题时可利用通讯工具向教师请教,教师可随时随地向学生传授知识,便于教学过程更好展开。

结束语:

提高各高校C语言教学效果不言而喻,当前教学中提高教学效果方式多种多样,教师在教学中应结合实际情况采取最佳教学方法提高学生C语言编程能力,为学生日后更深入的学习以及求职奠定基础。

【参考文献】

[1]刘向阳.C语言程序设计教学方法研究[J].科技信息,2013,(16):264.

[2]曾正军.在教学中对学生C语言编程能力的培养[J].南昌高专学报,2004,19(1):76-76,78.

[3]李海勝.C语言程序设计的教学思考[J].时代教育,2014,(7):180-180.

c语言高效编程几招 篇9

C语言是很多程序猿的入门语言,而且C语言也是一门用不过时的语言。编写高效简洁的C语言代码,是许多软件工程师追求的目标。今天传智播客C/C++培训专家针对编程工作中的一些体会和经验给大家做相关的阐述。

第一招:以空间换时间

计算机程序中最大的矛盾是空间和时间的矛盾,那么,从这个角度出发逆向思维来考虑程序的效率问题,我们就有了解决问题的第1招--以空间换时间。比如说字符串的赋值: 方法A:通常的办法 #define LEN 32 char string1 [LEN];memset(string1, 0, LEN);strcpy(string1, “This is a example!”);方法B:

const char string2[LEN] =“This is a example!”;char * cp;cp = string2;

从上面的例子可以看出,A和B的效率是不能比的。在同样的存储空间下,B直接使用指针就可以操作了,而A需要调用两个字符函数才能完成。B的缺点在于灵活性没有A好。在需要频繁更改一个字符串内容的时候,A具有更好的灵活性;如果采用方法B,则需要预存许多字符串,虽然占用了大量的内存,但是获得了程序执行的高效率。

第二招:数学方法解决问题

现在我们演绎高效C语言编写的第二招--采用数学方法来解决问题。数学是计算机之母,没有数学的依据和基础,就没有计算机的发展,所以在编写程序的时候,采用一些数学方法会对程序的执行效率有数量级的提高。举例如下,求 1~100的和。方法C: int I , j;for(I = 1;I<=100;I ++){ j += I;} 方法D int I;I =(100 *(1+100))/ 2;

这个例子是我印象最深的一个数学用例,是我的计算机启蒙老师考我的。当时我只有小学三年级,可惜我当时不知道用公式 N×(N+1)

/ 2 来解决这个问题。方法E循环了100次才解决问题,也就是说最少用了100个赋值,100个判断,200个加法(I和j);而方法F仅仅用了1个加法,1 次乘法,1次除法。效果自然不言而喻。所以,现在我在编程序的时候,更多的是动脑筋找规律,最大限度地发挥数学的威力来提高程序运行的效率。

第三招:使用位操作

实现高效的C语言编写的第三招——使用位操作。减少除法和取模的运算。在计算机程序中数据的位是可以操作的最小数据单位,理论上可以用“位运算”来完成所有的运算和操作。一般的位操作是用来控制硬件的,或者做数据变换使用,但是,灵活的位操作可以有效地提高程序运行的效率。举例如下: 方法E int I,J;I = 257 /8;J = 456 % 32;方法F int I,J;I = 257 >>3;J = 456-(456 >> 4 << 4);在字面上好像F比E麻烦了好多,但是,仔细查看产生的汇编代码就会明白,方法E调用了基本的取模函数和除法函数,既有函数调用,还有很多汇编代码和寄存器参与运算;而方法F则仅仅是几句相关的汇编,代码更简洁,效率更高。当然,由于编译器的不同,可能效率的差距不大,但是,以我目前遇到的MS C ,ARM C 来看,效率的差距还是不小。相关汇编代码就不在这里列举了。

运用这招需要注意的是,因为CPU的不同而产生的问题。比如说,在PC上用这招编写的程序,并在PC上调试通过,在移植到一个16位机平台上的时候,可能会产生代码隐患。所以只有在一定技术进阶的基础下才可以使用这招。用移位实现乘除法运算

a=a*4;

b=b/4;

可以改为:

a=a<<2;

b=b>>2;

说明:

除2 = 右移1位 乘2 = 左移1位

除4 = 右移2位 乘4 = 左移2位

除8 = 右移3位 乘8 = 左移3位

......通常如果需要乘以或除以2的n次方,都可以用移位的方法代替。大部分的C编译器,用移位的方法得到代码比调用乘除法子程序生成的代码效率高。

第四招:汇编嵌入

高效C语言编程的必杀技,第四招——嵌入汇编。“在熟悉汇编语言的人眼里,C语言编写的程序都是垃圾”。这种说法虽然偏激了一些,但是却有它的道理。汇编语言是效率最高的计算机语言,但是,不可能靠着它来写一个操作系统吧?所以,为了获得程序的高效率,我们只好采用变通的方法--嵌入汇编,混合编程。举例如下,将数组一赋值给数组二,要求每一字节都相符。char string1[1024],string2[1024];方法G int i;for(i =0;i<1024;i++)*(string2 + i)= *(string1 + i)方法H #ifdef _PC_ int I;for(I =0;I<1024;I++)*(string2 + I)= *(string1 + I);#else #ifdef _ARM_ __asm

{ MOV R0,string1 MOV R1,string2 MOV R2,#0 loop: LDMIA R0!, [R3-R11] STMIA R1!, [R3-R11] ADD R2,R2,#8 CMP R2, #400 BNE loop } #endif 方法G是最常见的方法,使用了1024次循环;方法H则根据平台不同做了区分,在ARM平台下,用嵌入汇编仅用128次循环就完成了同样的操作。这里有朋友会说,为什么不用标准的内存拷贝函数呢?这是因为在源数据里可能含有数据为0的字节,这样的话,标准库函数会提前结束而不会完成我们要求的操作。这个例程典型应用于LCD数据的拷贝过程。根据不同的CPU,熟练使用相应的嵌入汇编,可以大大提高程序执行的效率。

虽然是必杀技,但是如果轻易使用会付出惨重的代价。这是因为,使用了嵌入汇编,便限制了程序的可移植性,使程序在不同平台移植的过程中,卧虎藏龙,险象环生!同时该招数也与现代软件工程的思想相违背,只有在迫不得已的情况下才可以采用。

c语言高效编程几招 篇10

(1)“我的程序都是对的,可结果不对”

想想你的周围,是不是也有人说这样的话?如果你也曾经说过,那就此打住,不要再说这句话,因为这句话只会显示说话者的无知。既然程序都是对的,那为什么结果不对?

(2)“程序=算法+数据结构”

如果刚刚学完C语言,我们说这样的话,完全可以理解,而且可以说是正确的。但是如果你是一位即将从事C/C++编程的程序员,那么很遗憾,这个说法只能判错,殊不知,世界上还有另一种说法:

程序 = 对象+ 消息

“程序=算法+数据结构”只对面向过程的语言(C)成立,而对面向对象的语言(C++),则只能表述为“程序=对象+消息”。传统的过程式编程语言以过程为中心以算法为驱动,面向对象的编程语言则以对象为中心以消息为驱动。这里的消息是广义的,对象A调用了对象B的成员函数,可看作对象A给B发消息。

(3)“程序编出来,运行正确就行了”

运行正确的程序并不一定是好程序,程序员时刻要牢记的一条就是自己写的程序不仅是给自己看的,要让别人也能轻易地看懂。很遗憾,许多的编程新手不能清晰地驾驭软件的结构,对头文件和实现文件的概念含糊不清,写出来的程序可读性很差。

C程序采用模块化的编程思想,需合理地将一个很大的软件划分为一系列功能独立的部分合作完成系统的需求,在模块的划分上主要依据功能。模块由头文件和实现文件组成,对头文件和实现文件的正确使用方法是:

规则1 头文件(.h)中是对于该模块接口的声明,接口包括该模块提供给其它模块调用的外部函数及外部全局变量,对这些变量和函数都需在.h中文件中冠以extern关键字声明;

规则2 模块内的函数和全局变量需在.c文件开头冠以static关键字声明;

规则3 永远不要在.h文件中定义变量;

许多程序员对定义变量和声明变量混淆不清,定义变量和声明变量的区别在于定义会产生内存分配的操作,是汇编阶段的概念;而声明则只是告诉包含该声明的模块在连接阶段从其它模块寻找外部函数和变量。如:

/*模块1头文件:module1.h*/

int a = 5; /* 在模块1的.h文件中定义int a */

/*模块1实现文件:module1 .c*/

#include “module1.h” /* 在模块1中包含模块1的.h文件 */

/*模块2实现文件: module2.c*/

#include “module1.h” /* 在模块2中包含模块1的.h文件 */

/*模块2 实现文件:module3 .c*/

#include “module1.h” /* 在模块3中包含模块1的.h文件 */

以上程序的结果是在模块1、2、3中都定义了整型变量a,a在不同的模块中对应不同的地址单元,这明显不符合编写者的本意。正确的做法是:

/*模块1头文件:module1.h*/

extern int a; /* 在模块1的.h文件中声明int a */

/*模块1实现文件:module1 .c*/

#include “module1.h” /* 在模块1中包含模块1的.h文件 */

int a = 5; /* 在模块1的.c文件中定义int a */

/*模块2 实现文件: module2 .c*/

#include “module1.h” /* 在模块2中包含模块1的.h文件 */

/*模块3 实现文件: module3 .c*/

#include “module1.h” /* 在模块3中包含模块1的.h文件 */

这样如果模块1、2、3操作a的话,对应的是同一片内存单元。

规则4 如果要用其它模块定义的变量和函数,直接包含其头文件即可。

许多程序员喜欢这样做,当他们要访问其它模块定义的变量时,他们在本模块文件开头添加这样的语句:

extern int externVar;

抛弃这种做法吧,只要头文件按规则1完成,某模块要访问其它模块中定义的全局变量时,只要包含该模块的头文件即可。

(4)“数组名就是指针”

许多程序员对数组名和指针的区别不甚明了,他们认为数组名就是指针,而实际上数组名和指针有很大区别,在使用时要进行正确区分,其区分规则如下:

规则1 数组名指代一种数据结构,这种数据结构就是数组;

例如:

char str[10];

char *pStr = str;

cout << sizeof(str) << endl;

cout << sizeof(pStr) << endl;

输出结果为:

10

4

这说明数组名str指代数据结构char[10]。

规则2 数组名可以转换为指向其指代实体的指针,而且是一个指针常量,不能作自增、自减等操作,不能被修改;

char str[10];

char *pStr = str;

str++; //编译出错,提示str不是左值

pStr++; //编译正确

规则3 指向数组的指针则是另外一种变量类型(在WIN32平台下,长度为4),仅仅意味着数组的存放地址;

规则4 数组名作为函数形参时,在函数体内,其失去了本身的内涵,仅仅只是一个指针;很遗憾,在失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等操作,可以被修改,

例如:

void arrayTest(char str[])

{

cout << sizeof(str) << endl; //输出指针长度

str++; //编译正确

}

int main(int argc, char* argv[])

{

char str1[10] = “I Love U”;

arrayTest(str1);

return 0;

}

(5)“整形变量为32位”

整形变量是不是32位这个问题不仅与具体的CPU架构有关,而且与编译器有关。在嵌入式系统的编程中,一般整数的位数等于CPU字长,常用的嵌入式CPU芯片的字长为8、16、32,因而整形变量的长度可能是8、16、32。在未来64位平台下,整形变量的长度可达到64位。

长整形变量的长度一般为CPU字长的2倍。

在数据结构的设计中,优秀的程序员并不会这样定义数据结构(假设为WIN32平台):

typedef struct tagTypeExample

{

unsigned short x;

unsigned int y;

}TypeExample;

他们这样定义:

#define unsigned short UINT16 //16位无符号整数

#define unsigned int UINT32 //32位无符号整数

typedef struct tagTypeExample

{

UINT16 x;

UINT32 y;

}TypeExample;

这样定义的数据结构非常具有通用性,如果上述32平台上的数据发送到16位平台上接收,在16位平台上仅仅需要修改UINT16、UINT32的定义:

#define unsigned int UINT16 //16位无符号整数

#define unsigned long UINT32 //32位无符号整数

几乎所有的优秀软件设计文档都是这样定义数据结构的。

(6)“switch和if …else…可随意替换”

switch语句和一堆if…else…的组合虽然功能上完全一样,但是给读者的感受完全不一样。if…else…的感觉是进行条件判断,对特例进行特别处理,在逻辑上是“特殊与一般”的关系,而switch给人的感觉是多个条件的关系是并列的,事物之间不存在特殊与一般的关系,完全“对等”。

譬如:

//分别对1-10的数字进行不同的处理,用switch

switch(num)

{

case 1:

case 2:

}

//对1-10之间的数字进行特殊处理,用if

if(num < 10 && num >1)

{

}

else

{

}

许多时候,虽然不同的代码可实现完全相同的功能,但是给读者的感觉是完全不同的。譬如无条件循环:

while(1)

{

}

有的程序员这样写:

for(;;)

{

}

这个语法没有确切表达代码的含义,我们从for(;;)看不出什么,只有弄明白for(;;)在C/C++语言中意味着无条件循环才明白其意。而不懂C/C++语言的读者看到while(1)也可猜到这是一个无条件循环。

(7)“免得麻烦,把类里面的成员函数都搞成public算了”

许多人编C++程序的时候,都碰到这样的情况,先前把某个成员函数定义成类的private/protected函数,后来发现又要从外面调用这个函数,就轻易地将成员函数改为public类型的。甚至许多程序员为了避免访问的麻烦,干脆把自己添加的成员函数和成员变量都定义成public类型。

殊不知,这是一种规划的失败。在类的设计阶段,我们就要很清晰地知道,这个类的成员函数中哪些是这个类的接口,哪些属于这个类内部的成员函数和变量。一般的准则是接口(public成员)应在满足需求的前提下尽可能简单!

所以不要轻易地将private/protected成员改为public成员,真正的工作应该在规划阶段完成。

上一篇:教育相关的公益广告词下一篇:入职面试自我介绍范文