C语言的魅力与瑕疵

来源:互联网 发布:查看mac激活时间 编辑:程序博客网 时间:2024/04/28 17:10

大家好,今天给大家分享下我在学习C语言的过程中的心得体会,从我个人的角度谈一谈对C语言的理解。

本人现在开学上大四,学习嵌入式也接近一年了。在不断学习的过程中越来越体会到C语言的重要性,与他的魅力,当然也有一些我认为美中不足的地方,废话不多说,我们进入正题。

第一点:嵌入式开发过程中,C语言为什么受欢迎?

这一点,我想大家基本上都知道原因。C语言不但语言简洁、紧凑、结构灵活,更重要的有三点:

1:C可以直接对计算机硬件进行操作,C允许直接访问物理地址,能进行位操作,可以实现汇编语言的大部分功能。

2:众所周知,汇编语言生成的目标代码的效率是最高的,但据统计,对于同一个问题,用C语言编写的程序生成的目标代码的效率仅比汇编语言编写的程序低10%--20%。但用C编写就比用汇编方便、容易的多,并且可读性强。

3:C语言的可移植性好。C语言编写的程序基本上不用修改就能应用于各种机型和各种操作系统。

第二点:嵌入式学习中,C语言基础一定要达标,越精通越好

这一点以我自身为例,我去年报了汇文教育的嵌入式课程,开始了嵌入式的学习,我觉得这让我在短时间内有了很大的提升,这与重视C语言基础密不可分。最先讲的就是C语言基础,包括其他的一些培训,基本上都要从C语言开始讲。这也说明了C语言的基础性。

我们的学习过程是一个不断进阶的过程,最开始我们也许只会垒一道墙,然后摸索的做出一座房子,然后学会建造不同类型的房子,在之后也许就会盖一栋楼,扩展之后再会建造不同类型的建筑物,最后也许几个人联合起来创建了一个城市。而C语言中的概念和代码,就像是每一块砖瓦,只有我们熟悉它了解他甚至精通它,才能让我们的基础打的更牢固,保证每块砖瓦的质量过关,建筑物才会稳定,所有的建筑物都稳定,你的城市就不怕内部崩溃,更不怕外界的打击。

所以,与其说自己了解多种语言,不如说自己精通一门语言。一个好的基础,肯定会在某个时间段受益。所以,如果你是新手,正在学习的过程中,不要贪心想把多种语言都了解一遍,建议先把一门语言学精。

以我为例,因为汇文的学员培训结束后都要求参加PAT(浙江大学计算机程序设计能力考试),(分数高的话很多知名企业可以免笔试)。我花了一个多月的时间把网站上的:乙级真题及训练集的40道题全部做完了。别小瞧这40道题,它真的让我的编程能力上升了一个档次。包括算法的精简,代码长度的限制,以及密不透风的逻辑要求,每道题都是对语言基础和逻辑思维的挑战。

这40道题带来的好处就是:在之后C++,QT,LINUX的学习过程中我程序中出现的BUG比他人少很多,无论是语法上的BUG还是逻辑上的BUG。这让我有更多的时间超额完成任务,巩固的更扎实。

第三点:说了这么多,给一些初学者带来点实际的!(大神勿喷)

一:C语言中一些“陷阱”,是在写C程序过程中发现的一些容易误导程序员的地方(之前被这些东西害惨了)

(1)看如下程序:

#include <stdio.h>

 

int main()

{

int i = 0;

char a;

for(i = 0;i < 20;i++)

{

scanf("%c",&a);

printf("%c………………\n",a);

}

return 0; 

有兴趣的初学者可以试验一下,看和你想的结果有何不同。

我的输入: a  “回车”   b    “回车”   c   “回车” 

输出如下:

 

我们发现我们每次输入“回车”之后,就会自动输出一个“回车”。

原因是:我们再输入完字符之后点回车,其中“回车”也被写在了输入的缓存区内,下一次循环时scanf()函数将缓存区里的“回车”写入字符,就产生了上面的结果。

解决办法:在scanf("%c",&a);后面加上一句话:fflush(stdin);

这次再试试,看看是不是我们想要的结果呢。

 

(2)看如下程序:

#include <stdio.h>

 

int main() 

{

int a = 0;

//定义一个变量  a  =  0 \

printf("a = %d\n",a);

printf("a = 0 ");

return 0; 

}

(测试的时候要完全一样,不要漏掉东西)这次猜一下会输出什么?

然而结果是这样的:

 

为什么会只打印出一个“a = 0 ”呢?

原因:是因为我注释的那一行(//定义一个变量  a  =  0 \)最后加上了一个字符:“\”。因为“\”代表此行未结束,所以下一行的内容被注释掉了。

解决办法:注意注释行中的字符说不定他就会影响我们程序的功能。

这种情况有时会在一些特殊的情况下被忽视,比如在文档里写的程序,但平时一般的编写C语言的软件都会把这种问题识别出来:

 

(3)看如下程序:

 #include <stdio.h>

 

int main()

{

int d = -1;

char a[] = "123";

if(d <= sizeof(a) - 2)

{

printf("%d <= %d\n",d,sizeof(a) - 2);

}

else

{

printf("%d > %d\n",d,sizeof(a) - 2);

}

一样的,还是先猜一下结果是什么?

然而:

 

为什么会出现这么看似离谱的答案呢?

原因:因为sizeof()的返回值的类型为:unsigned int(无符号类型)。在if语句比较的过程中,因为类型不同,所以编译器会将-1转换为unsigned int。因为编码的缘故,一般数据前有一个符号位,转化过程中-1被转化成了一个很大的数,所以导致结果出错。

解决办法:在if等需要比较的代码中保证比较值的类型相同。

二、还有很多需要我们注意的地方,希望初学者自己查询和学习

列举:

getchar();函数

putchar();函数

goto    语句

(C语言中指针的使用是一个重点,也是初学者最容易出错的地方,所以灵活,正确的运用指针是必须具备的能力。)

二维数组与二级指针。

内存泄漏。

三、讲完了一些语言,语句。也想和大家分享一下逻辑思维上的严谨,灵活的重要性

算法:是一个程序的灵魂,让自己的代码运行速度快,命令简洁,这是评判我们代码的标准。所以,在平时写程序的时候一定要注意让自己的代码的执行速度,最简单的:能用data++;的时候,就不要用data += 1;更不要用data = data + 1;。此外,代码简洁,并不是说代码越短越好,而是让人一眼就能看得清楚你的思路和结构。养成良好的代码风格也是我们需要具备的素质之一。

我也深知自己的功底仍然还不够,但我意识到了语言基础的重要性,意识到了学习也需要不断改进。

汇文教育的资深教师宋德锋老师曾经建议我们:有时定期的分析、改进自己之前写过的代码也很重要,这可以让我们改掉许多自身不良的变成习惯,会让我们的算法越来越优质,写出来的程序才能像艺术品一样。

所以,接下来我会把自己写过的PAT练习的代码发到博客上,进行重新的分析和改进,改进之前的算法和风格。

希望大家能关注我,希望新手能在这学到一些知识,同行间一起进行讨论,大神能给我一些更好的学习建议。

0 0
原创粉丝点击