C语言本身很简洁的,除了34个关键字(ANSI标准,但C99标准新增几个关键字及特性,用来定义新的数据类型、变长数组等)、40多个运算符、再明白数据的基本类型、程序的顺序、分支、循环3种基本结构,就OK了,就这点东西。一般,看上一周左右基本上就可以掌握。
但是,掌握了这些,你就觉得自己精通C语言、可以熟练运用C语言进行编程了吗?绝不可能。
人工智能时代,嵌入式和物联网的薪资也是水涨船高,嵌入式开发和物联网开发技术就是让物体变得更智能的技术。
学习C语言也是一样,尤其是对于嵌入式底层工程师来说,我们要学习的不仅仅是C语言的基本语法,更重要的是如何通过C语言这个工具,去理解我们的计算机系统、CPU架构:
1)程序到底是如何编译、链接、和运行的?
2)运行时各种代码段、数据段、BSS段、堆栈在内存中如何分布,如何管理的?
3)程序在不同的平台(ARM、X86)、裸机环境或有OS的环境(linux、uc/os等)有何不同?
4)静态链接与动态链接的过程有何差异,为什么要使用动态链接?共享库?
5)不同的开发平台、IDE、编译器,C语言的编程有何差异和不一样的地方,如何做到跨平台、增强程序的可移植性和鲁棒性?
6)各种变量名、函数名、数组名、指针的本质是什么?编译器是如何处理的?
搞懂了这些语言背后计算机系统知识,还远远不够,还要去学习操作系统相关的知识:进程、线程、中断、内存管理
对于嵌入式开发来说,还要学习ARM等处理器架构知识、GCC编译器对C标准的各种扩展,各种生僻的用法,否则你去看linux内核代码、驱动代码,总感觉“怪怪的”,好像哪里不对,跟平时的C语言不太一样,感觉自己学的是一门假C语言......
C语言的精华是内存、存储管理。各种隐藏很深的bug其实也跟内存有关:内存越界、内存泄露、野指针等等,一个不经意的疏漏,就可能阴沟里翻船。就是有多年工作经验的工程师也不敢保证自己写的代码一定没有问题。C语言默认大家都是大牛、计算机专家,可惜现实中往往太多挖坑小能手,太多猪一样的队友。如何养成良好的编程习惯,避免各种bug,也是C语言进阶学习的一个重点。
为了测试一下你对C语言的掌握程度,下面的几个测试题,可以自我测试一下,检测一下自己的C语言水平,是否达到嵌入式工程师(尤其是内核驱动工程师)的要求:
1)你对以下C语言的基本概念是否掌握?是否能用一句话概括出来?
Plaintext |
2)一个sizeof(int)引发的思考
3)自增运算符带来的思考
下面一段程序,在不同的编译器上编译,结果是多少,一样吗?为什么?
4)代码分析
使用tc、C-free、GCC、VC++6.0、visual studio分别编译下面代码,会出现什么问题?
5)在linux环境下,运行下面代码,会出现什么问题?