c语言小技巧
多参考别人的优秀的源代码,试着在自己写写代码熟悉语法和编写代码的规则。
要学会自己修改自己的错误,在修改的过程中将学会不少的编程经验。
多用输入(scanf)和输出(printf)来调试错误的代码段,就可以很快的找到错误的所在。
‘贰’ 怎样才能学好C语言
1、学好c语言,你可以很好地应付任何一种编程工具。
2、一定要多上机练习,通过程式了解相关知识。几经反复方得正果。
3、不要把学习c语言当成一种任务,更不要把它看成很难完成的任务。要充满自信,只要是一个智力正常的人都能学好c语言。始终保持游戏的心态,多发现其中的乐趣。当感到编程趣味无穷,那你在电脑方面将前程无量。
4、如果一个程式一时无法弄清楚最后暂时放在一边,过一段时间你可能会从其他的程式中悟出道理。
5、c语言是一个整体,各个方面是有机联系的,要从总体上把握它,不要把它割裂成互不关联的部件。
6、不要完全相信教材(包括本讲义),所有结论最好都上机验证。
怎样学好c语言
1.
工欲善其事,必先利其器
准备工作:一个开发环境,如turbo
c
2.0、visual
c++等开发工具;一本好教材,如谭浩强主编的《c语言程序设计》(第二版)。我当时看的是他的第一版,就为它的简洁、完美所吸引,简直爱不释手,用了两个星期一口气看完。
2.
秘密武器
初学者学习计算机语言要会“读程序”,要对小型的应用型、游戏型程序感兴趣,并模仿去加深对c语言程序设计的理解和操作,只有不断地写程序、调试程序才能得到编写程序的经验和加深对程序的理解,这也是学习编写优秀高级程序的秘密武器。
3.
发扬探索精神
学习c语言程序设计有点像做数学难题,只要我们善于思考,善于探索,发扬探索精神去寻找好的设计思想和方法,才能把c语言的精髓真正地掌握。
备战c语言考试要诀
1.
了解大纲,临阵不乱
各类笔试中,大多数考题是与大纲要求的基本内容一致的,难度不高,但内容十分广泛,应牢固掌握c语言考试大纲要求的基础部分。只有熟悉题型,理解语法、句法,做到心中有数,才能临阵不乱。
2.
善于归纳,强化记忆
对于需要记忆的计算机基础知识和基本概念,如果考试时因此失分就十分可惜。如:c语言中有几种不同的数据类型?运算的优先级别是怎样的?因此我们需要善于归纳这些计算机基础知识,并在理解的基础上强化记忆。
3.
重视实践,善于调试
计算机科学是一门理论性、实践性都很强的学科,对c语言考试的参加者来说,基础理论方面要求不高,而上机试题往往是很多考生不能通过考试的重要原因,因此要勤于实践。
4.
多做练习,查漏补缺
在认真地学完指定用书后,最好再找些试题,认真地测试一下,一则可以检查自己的复习情况;二则可以查漏补缺;三则可以调节心理状况,以备正式考试时沉着冷静、万无一失。
‘叁’ C语言中有哪些实用的编程技巧
这篇文章主要介绍了C语言高效编程的几招小技巧,本文讲解了以空间换时间、用数学方法解决问题以及使用位操作等编辑技巧,并给出若干方法和代码实例,需要的朋友可以参考下
引言:
编写高效简洁的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语言编写的第二招——采用数学方法来解决问题。
数学是计算机之母,没有数学的依据和基础,就没有计算机的发展,所以在编写程序的时候,采用一些数学方法会对程序的执行效率有数量级的提高。
举例如下,求 1~100的和。
方法E
代码如下:
int I , j;
for (I = 1 ;I<=100; I ++){
j += I;
}
方法F
代码如下:
int I;
I = (100 * (1+100)) / 2
这个例子是我印象最深的一个数学用例,是我的计算机启蒙老师考我的。当时我只有小学三年级,可惜我当时不知道用公式 N×(N+1)/ 2 来解决这个问题。方法E循环了100次才解决问题,也就是说最少用了100个赋值,100个判断,200个加法(I和j);而方法F仅仅用了1个加法,1 次乘法,1次除法。效果自然不言而喻。所以,现在我在编程序的时候,更多的是动脑筋找规律,最大限度地发挥数学的威力来提高程序运行的效率。
第3招:使用位操作
实现高效的C语言编写的第三招——使用位操作,减少除法和取模的运算。
在计算机程序中,数据的位是可以操作的最小数据单位,理论上可以用“位运算”来完成所有的运算和操作。一般的位操作是用来控制硬件的,或者做数据变换使用,但是,灵活的位操作可以有效地提高程序运行的效率。举例如下:
方法G
代码如下:
int I,J;
I = 257 /8;
J = 456 % 32;
方法H
int I,J;
I = 257 >>3;
J = 456 - (456 >> 4 << 4);
在字面上好像H比G麻烦了好多,但是,仔细查看产生的汇编代码就会明白,方法G调用了基本的取模函数和除法函数,既有函数调用,还有很多汇编代码和寄存 器参与运算;而方法H则仅仅是几句相关的汇编,代码更简洁,效率更高。当然,由于编译器的不同,可能效率的差距不大,但是,以我目前遇到的MS C ,ARM C 来看,效率的差距还是不小。相关汇编代码就不在这里列举了。
运用这招需要注意的是,因为CPU的不同而产生的问题。比如说,在PC上用这招编写的程序,并在PC上调试通过,在移植到一个16位机平台上的时候,可能会产生代码隐患。所以只有在一定技术进阶的基础下才可以使用这招。
第4招:汇编嵌入
高效C语言编程的必杀技,第四招——嵌入汇编。
“在熟悉汇编语言的人眼里,C语言编写的程序都是垃圾”。这种说法虽然偏激了一些,但是却有它的道理。汇编语言是效率最高的计算机语言,但是,不可能靠着它来写一个操作系统吧?所以,为了获得程序的高效率,我们只好采用变通的方法 ——嵌入汇编,混合编程。
举例如下,将数组一赋值给数组二,要求每一字节都相符。
代码如下:
char string1[1024],string2[1024];
方法I
代码如下:
int I;
for (I =0 ;I<1024;I++)
*(string2 + I) = *(string1 + I)
方法J
代码如下:
#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
方法I是最常见的方法,使用了1024次循环;方法J则根据平台不同做了区分,在ARM平台下,用嵌入汇编仅用128次循环就完成了同样的操作。这里有 朋友会说,为什么不用标准的内存拷贝函数呢?这是因为在源数据里可能含有数据为0的字节,这样的话,标准库函数会提前结束而不会完成我们要求的操作。这个 例程典型应用于LCD数据的拷贝过程。根据不同的CPU,熟练使用相应的嵌入汇编,可以大大提高程序执行的效率。
虽然是必杀技,但是如果轻易使用会付出惨重的代价。这是因为,使用了嵌入汇编,便限制了程序的可移植性,使程序在不同平台移植的过程中,卧虎藏龙,险象环生!同时该招数也与现代软件工程的思想相违背,只有在迫不得已的情况下才可以采用。切记,切记。
‘肆’ 学习c语言的方法
第一步、验证性练习
在这一步要求按照教材上的程序实例进行原样输入,运行一下程序是否正确。在这一步基本掌握C语言编程软件的使用方法(包括新建、打开、保存、关闭C程序,熟练地输入、编辑C程序;初步记忆新学章节的知识点、养成良好的C语言编程风格)。
第二步、照葫芦画瓢
在第一步输入的C程序的基础上进行试验性的修改,运行一下程序看一看程序结果发生了什么变化,分析结果变化的原因,加深新学知识点的理解。事实上这和第一步时同步进行的,实现“输入”加深知识的记忆,“修改”加深对知识的理解。记忆和理解是相辅相成的,相互促进。
第三步、不看教材看是否能将前两步的程序进行正确地输入并运行。
在这一步要求不看教材,即使程序不能运行,看能否将其改正,使其能正确运行。目的是对前两步的记忆、理解进一步强化。
第四步、增强程序的调试能力
在《Turbo C/C++ for Windows 集成实验与学习环境》集成的教材中每章都有C语言初学者易犯的错误,按照易出错的类型,将教材中的正确的程序改成错误的程序,运行一下程序,看出现的错误信息提示,并记下错误信息,再将程序改成正确的,运行一下程序。这样反复修改,就能够学习C语言程序发生错误的原因和修改错误的能力。
第五步、研究典型的C语言程序,提高程序设计能力
经过上述过程的学习,我们已经学会了C语言各种语句的流程(即计算机是如何执行这些语句的过程),然后就可以研读别人编写C语言经典程序,看懂别人是如何解决问题的,学习解决问题的方法和程序设计技巧,提高自己的程序设计能力。
在软件中有50多个典型的源程序,研究它的实现方法,提高自己的程序设计能力。
第六步、研究课程设计源成序,提高C语言程序设计能力和调试较大程序的能力。
C语言课程设计的目的:是让学生综合利用所学的C语言知识,解决一些接近实际问题题目,提高程序设计和调试较大程序的能力,为进一步进行软件开发打下坚实的基础。
学习C语言,就来北京尚学堂,优秀的师资和科学的授课方式,会带给你最好的学习体验。
‘伍’ 学习c语言的技巧有哪些呢
工欲善其事,必先利其器。所以选几本好书十分重要:我建议不管是基础还是提升,书最好是一本老外写的和一本咱国人写的。因为老外重思路,国人重基础。
另外一定要下一个C语言函数标准库,学会自己查函数,用函数,当然没有必要全记住,只要会查会用就行。
练当然是不可缺少的哦,所以一定要有个VC++呀。不过说一句,VC++不支持c语言的图形化呀,当学到图形时,可能会打击你的信心哦。
好了,兵器已有,该学会打仗了。当自己有一定基础时,就要去看看别人的程序,来提高自己的编程水平。
其实技巧真的很多,就不在一一列举了,你好好加油吧。
另外说一句其实暴风影音、酷狗等就是用c语言编出来的,希望这句话能激发你的兴趣。
小弟我不才,至今还未编出一个像样的播放器,希望一浪推一浪,你好好加油吧。
如有问题,可以多多交流。
附说一句,如果你学C语言是为了考2级等级考试的话,那我的这些所谓的技巧可能帮不上你了哦。
因为2级考试太基础了。多做些题就OK了,别被谭浩强给害了。
‘陆’ 学会C语言的好方法
每个人在初学C语言时都有这样或那样的疑惑,而且没有语言基础的朋友也不清楚怎么学。结合我自己的经历,给你提供一下几点经验:
1:必须有一本好的教材。用谭浩强的《c程序设计》
就不错。目前在这方面是销售量最高的。
2:必须要问!只有书的话是不够的,毕竟很多东西不是一下子就能理解了的,一定要多问!
3:做题。《C程序设计》
的每一道题目都要做完!不会的话就请教别人,但是必须先自己思考,写写代码,写错了要自己调试,这是一个提高的过程,不要一遇到不会的或者错误的代码就立马问别人。
4:多看别人的程序,可以上网上找那个C语言经典算法100例,把每一个代码都研究透。
上面的都做完了,你C语言
应该是比较熟练了。
另外说一句,方法其实并不是最重要的。最重要的是你要有毅力,要有学好C语言的决心!更要有信心!
不付出努力,是不会得到回报的。
‘柒’ C语言的技巧
如果你真的想学习编程,就请你认真的阅读下去。
大家都知道C语言很强大,这个强大一是来自其功能,第一次出名就很牛逼的编出了UNIX系统。然后跟着UNIX这个明星,于是自己的影响一路飙升。二是C语言不但能够写UNIX的操作系统,而且编写LINUX和Windows等操作系统时都离不开他的身影。三是它的实用,如果你是一个理科生,如果你学过单片机,你就知道无C不能。第四、很多就是电脑高手或黑客梦想的驱使,还有一些高手的推荐,于是你便选择的C语言。
不管你是何种原因驱使,何种目的的驱动?当你选择这个语言的时候,首先要考虑,你的基础能行不?和你的目的到底是什么?如果你是一个电脑菜鸟,或只想了解一下什么是编程,我是不赞成学习C的,因为C初学时,很伤人斗志的,也就是说你可能学习了一个月,还只能在黑色的框中徘徊,甚至资质差的只能算1+2+3+4+。。。+1000=?这个,,,会让你成为编程高手吗?显然不能!如果你以后会从事硬件方面的开发,或在软、硬件之间打交道,或一直从事软件开发,那么你一定要学习C,而且是不学不行的,有可能你还要学习汇编,因为有些情况汇编对硬件的操作比C更给力。而且他也是是不学不行的。
对于那些几乎很少和硬、软件打交道的童鞋,本人不建议学习C,因为一段时间后你会很快放弃它的,因为你知道1+2+3+。。。+1000=?根本就不能称为程序,如果你掌握技巧,你算得比计算机还快,这和你的编程高手的理想是根本搭不上边的。浪费你的时间,同时也在考验你的心理,同时更会给你迷茫。针对基础差,以后不想在软件和硬件间混以及只想学习编个程序然后就出结果的童鞋,不建议学习C,你可以学习易语言,学习VB。原因他们是高级语言,简单,易学、强大、更容易出成果。
比如VB写个窗口,构建个菜单,写个网页浏览器、写个远控(比如木马)等等,一个多月绝对能熟练掌握。我学近两年C了,都没法编出网页浏览器,更无法让一个MM图片来美化我黑不笼统的窗口,但VB你只需要一分钟,便可以让你的窗口充满色彩缤纷的效果,对于网络的端口扫描器,远程聊天控制,远程主机资源浏览等,VB都行。而且掌握他后,你变又附加的掌握了VBscript这个脚本语言。对于易语言,推荐不会英语的同学学吧,这个是中国人写的编程工具,我没用过,根据我的了解,功能也是很强大,中文的编程语言,会让你更快的掌握这个语言,编出自己的作品。
上面的一番话,只是告诉你C固然好,但不是针对所有人都好。世界上没有包治百病的仙丹,也没有适合所有人的编程语言。
对于学习了C的童鞋,你面临的是如何去深化,去巩固C。学习了C语言基础不是代表你已经会用C了,因为这才代表你刚入门,接下来你要学的是《数据结构》,这个是必修的,没有他你无法编出严谨强大的C程序,开发出自己的系统——如果有意向开发系统的。
然后你要去学习操作系统的API,这个也很重要。如果你掌握了API,那么你才能真正的可以成为自己学过C,会用C,才能知道原来C也可以无所不能。
这里是一个童鞋(08_小汪)的建议,我感觉很好,摘录下来“首先C是入门,如果想C很牛的话,就要去研究算法,C是为了过度到C++,C++会了。就要学windows程序设计,然后就学Visual c++,毕竟C++是计算机的底层。。。还有多动手写程序,不然学的永远不是自己的。。。”
然后08_小汪又推荐了四本书:
“推荐4本书《C语言陷阱和指针》,《C语言编程专家》,《thinking C++》,《数据结构-使用C++标准模板库(STL)》。。。去专门的论坛看可能会专业点,毕竟面向的对象不同。。。”
有兴趣深入研究C的童鞋,你需要读一下。
C快速入门的方法是不断的巩固、不断的编程。实践是学习和掌握的重要途径。
无论你学任何一门语言,都要一心不变的坚持下去,不要在学VB时,听某某高手说C很强大,就放弃了VB,或在学易语言时,听说易语言有局限而立即转向别的语言。这样不会成就你编程高手的梦想,只会让你习惯半途而废,然后是任何一个语言都不能学会。记住,只要你选择了,一定要走下去,最后成功的才可能是你
更多资料【【【【爱我中 华夏联盟 欢迎你】】】】】】
‘捌’ 计算机二级C语言备考技巧有哪些
1、笔试试卷分析
笔试试卷由选择题和填空题组成。选择题和填空题一般对基本知识和基本操作进行考查,它主要是测试我们对相关概念的掌握是否全面、理解是否准确、思路是否清晰。
(1)选择题分析
选择题为单选题,是客观题,每道题的分值为2分,试题覆盖面广,一般情况下我们不可能做到对每个题目都有把握答对。考试时就需要我们学会放弃,对于不确定的题目不要在上面花费太多的时间,先记住,然后作答其他题目。等最后有空余的时间再回过头来仔细考虑这些题目。二级C语言笔试题目众多,分值分散,我们一定要有全局观,合理地安排考试时间。
选择题一般分为:正面试题和反面试题。设问是正确观点的题称为正面试题,绝大多数选择题为正面试题;设问是是错误观点的题称为反面试题。我们在解答选择题时可以如下几个答题方法来答题,这样可以提高答题速度和准确率。
①顺选法:如果对题中的4个选项,一看就能肯定其中的1个是正确的,就可以直接得出答案。对于一些比较容易看出正确选项的题,可以使用排除错误选项。
②排除法:排除法是将错误答案一一排除的方法。对题中的4个选项逐个去掉错误的选项。对于一些比较容易看出错误选项的题,可以使用排除错误选项。
③比较法:这种办法是没有办法的办法,如果有些题实在是没有把握,那么就只有比较四个选项中那个更接近题目要求了(这也称之为“蒙猜法”)。
(2)填空题分析
填空填一般难度都比较大,一般需要我们准确地填入字符,往往需要非常精确,错一个字也不得分。在分值方面,每题也是2分。在作答填空题时要注意以几点:
①答案要写得简洁明了,尽量使用专业术语。
②认真填写答案,字迹要工整、清楚,格式要规范、正确,在把答案往答题卡上填写后尽量不要涂改。
③注意,在答题卡上填写答案时,一定要注意题目的序号,不要弄错位置。
④对于有两种答案的情况,只需填一种即可,多填并不多给分。
2、上机试题分析
一个C语言源程序总是在一定的硬件和软件环境支持下进行编辑、编译、连接和运行的,而这其中的每一步都直接影响程序调试的效率。所以初学者必须了解所使用的计算机系统的基本操作方法,学会使用该系统,了解在该系统上如何编辑、编译、连接和运行一个C语言程序。
上机考试重点考察我们综合运用基础的操作能力和程序编写能力,要求我们具有综合运用基础知识进行实际操作的能力。上机试题综合性强、难度较大。上机考试的评分是以机评为主,人工复查为辅的。机评不存在公正性的问题,却存在呆板的问题,有时还可能因为出题者考虑不周出现错评的情况。这就要求我们做题时要充分考虑到各种情况,尽可能的按规范编写程序,否则有可能答对不得分。
掌握好上机考试的考试技巧,可以使我们的实际水平在考试时得到充分发挥,从而取得较为理想的成绩。历次考试均有考生因为忽略了考试技巧,加之较为紧张的考场气氛影响了水平的发挥,致使考试成绩大大低于实际水平。因此我们在考试前,要有充分的准备。总结起来有以下几点供我们在复习和考试时借鉴:
(1)上机考试训练时,一定不要死记硬背。以往有部分考生能够顺利通过笔试,却不能通过上机考试,主要原因就是她们在平时训练时死记硬背,而没有真正的理解知识应用,到考试时,题目稍有变动就变的束手无策。所以我们一定要在熟记基本知识点的基础上,加强上机训练,做到真正理解、掌握解题方法和思路。
(2)一定要重视考试模拟软件的使用。应使用考试模拟软件进行实际的上机操作练习,尤其要做一些具有针对性的上机模拟题,以便熟悉考试题型,体验真实的上机环境,减轻考试时的紧张程度。
(3)学会并习惯使用编程软件的帮助系统。C语言编程软件有非常全面的帮助系统,熟练掌握、使用帮助系统,可以使我们减少记忆量,解决解题中的陌生、疑难问题。
(4)熟悉考试场地及环境,尤其是要熟悉考场的硬件情况和所使用的相关软件的情况。一般在正式考试前,考点会给我们提供一次模拟上机的机会,应尽可能地去参加。模拟考试时,不要把重点放在做题上,而应放在熟悉考试环境,相应软件的使用方法,考试系统的使用等方面。
(5)在考试时不要急燥、慌张,而是要认真、冷静地看清题目要求,在做完题后一定要保存文件,并运行程序检测运行结果是否符合题目要求。在考完交卷前先关闭掉C语言编程软件和其他打开的文件,再交卷,确保交卷过程中不出错误。
3、综合应试技巧
(1)认真审题,先分析,后下笔。试题的考核是有针对性的,因此在答题时也要有针对性。解答前,除了要看清问题外,还要弄清楚题目考核的意图。明白了问在那里后,就可以开始考虑好如何答题了,然后依思路从容做答。
(2)对于十分了解或熟悉的问题,切忌粗心大意、得意忘形,一定要认真看题、分析,避免掉入陷阱,确定后再写出答案。
(3)对于偶尔碰到或是虽然在复习中见过但已记不清的题目,也不要泄气,将自己的判断同书本知识联系起来做答;对于完全陌生的问题,实在不知如何根据书本知识进行解答时,可以采用“蒙猜法”,用自己的思考和逻辑推断作答。由于这这方法作出来的题没有多大把握得分,因此不要花费太多时间去研究它。
‘玖’ 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语言编写的第二招——采用数学方法来解决问题。
数学是计算机之母,没有数学的依据和基础,就没有计算机的发展,所以在编写程序的时候,采用一些数学方法会对程序的执行效率有数量级的提高。
举例如下,求 1~100的和。
方法E
int I , j;
for (I = 1 ;I<=100; I ++){
j += I;
}
方法F
int I;
I = (100 * (1+100)) / 2
这个例子是我印象最深的一个数学用例,是我的计算机启蒙老师考我的。当时我只有小学三年级,可惜我当时不知道用公式 N×(N+1)/ 2 来解决这个问题。方法E循环了100次才解决问题,也就是说最少用了100个赋值,100个判断,200个加法(I和j);而方法F仅仅用了1个加法,1 次乘法,1次除法。效果自然不言而喻。所以,现在我在编程序的时候,更多的是动脑筋找规律,最大限度地发挥数学的威力来提高程序运行的效率。
第3招:使用位操作
实现高效的C语言编写的第三招——使用位操作,减少除法和取模的运算。
在计算机程序中,数据的位是可以操作的最小数据单位,理论上可以用“位运算”来完成所有的运算和操作。一般的位操作是用来控制硬件的,或者做数据变换使用,但是,灵活的位操作可以有效地提高程序运行的效率。举例如下:
方法G int I,J; I = 257 /8; J = 456 % 32; 方法H int I,J; I = 257 >>3; J = 456 - (456 >> 4 << 4); 在字面上好像H比G麻烦了好多,但是,仔细查看产生的汇编代码就会明白,方法G调用了基本的取模函数和除法函数,既有函数调用,还有很多汇编代码和寄存器参与运算;而方法H则仅仅是几句相关的汇编,代码更简洁,效率更高。当然,由于编译器的不同,可能效率的差距不大,但是,以我目前遇到的MS C ,ARM C 来看,效率的差距还是不小。相关汇编代码就不在这里列举了。 运用这招需要注意的是,因为CPU的不同而产生的问题。比如说,在PC上用这招编写的程序,并在PC上调试通过,在移植到一个16位机平台上的时候,可能会产生代码隐患。所以只有在一定技术进阶的基础下才可以使用这招。 第4招:汇编嵌入 高效C语言编程的必杀技,第四招——嵌入汇编。 “在熟悉汇编语言的人眼里,C语言编写的程序都是垃圾”。这种说法虽然偏激了一些,但是却有它的道理。汇编语言是效率最高的计算机语言,但是,不可能*着它来写一个操作系统吧?所以,为了获得程序的高效率,我们只好采用变通的方法 ——嵌入汇编,混合编程。 举例如下,将数组一赋值给数组二,要求每一字节都相符。char string1[1024],string2[1024];方法Iint I;for (I =0 ;I<1024;I++)*(string2 + I) = *(string1 + I)方法J#ifdef _PC_int I;for (I =0 ;I<1024;I++)*(string2 + I) = *(string1 + I);#else#ifdef _ARM___asm{MOV R0,string1MOV R1,string2MOV R2,#0loop:LDMIA R0!, [R3-R11]STMIA R1!, [R3-R11]ADD R2,R2,#8CMP R2, #400BNE loop}#endif方法I是最常见的方法,使用了1024次循环;方法J则根据平台不同做了区分,在ARM平台下,用嵌入汇编仅用128次循环就完成了同样的操作。这里有朋友会说,为什么不用标准的内存拷贝函数呢?这是因为在源数据里可能含有数据为0的字节,这样的话,标准库函数会提前结束而不会完成我们要求的操作。这个例程典型应用于LCD数据的拷贝过程。根据不同的CPU,熟练使用相应的嵌入汇编,可以大大提高程序执行的效率。虽然是必杀技,但是如果轻易可能使用会付出惨重的代价。这是因为,使用了嵌入汇编,便限制了程序的可移植性,使程序在不同平台移植的过程中,卧虎藏龙,险象环生!同时该招数也与现代软件工程的思想相违背,只有在迫不得已的情况下才可以采用。切记,切记。
·下一条:编程修养
评论
发布者 标题 发布日期
暂没有任何评论
以下发言只是广嵌网会员个人意见,非本网立场 查看更多评论
发表评论
·尊重网上道德,遵守中华人民共和国的各项有关法律法规。
·承担一切因您的行为而直接或间接导致的民事或刑事法律责任。
·本站管理人员有权保留或删除其管辖留言中的任意内容,本站有权在网站内转载或引用您的评论。
·参与本评论即表明您已经阅读并接受上述条款。
标题:
发布者:
内容:
验证码:
相关信息
·.Net(C#)开发漫谈..
·.Net(C#)开发漫谈..
·C#编程实用技巧:轻松实..
·学生管理系统(C原代码)
·嵌入式智能人机界面与PL..
·嵌入式系统编程中的代码优..
·C++对象布局及多态实现..
·C和C++里面的lval..
·C语言平台缩短SoC前期..
·用Visual C++实..