我在知乎上回答的一个问题,转发到公众号上,给大家分享:

作者:王利涛@宅学部落

跟学英语一样,C语言也算是一门语言。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语言的基本概念是否掌握?是否能用一句话概括出来?

标识符、关键字、预定义标识符、分隔符、语法检查、语义检查、表达式、语句、左值、对象、结合性、左结合右结合、未定义行为

2)一个sizeof(int)引发的思考

•sizeof是函数吗?是关键字?预定义标识符? 后两者有何区别?•在32位和64位的Windows7系统下,结果分别是多少?•在32位和64位X86

CPU系统下,结果分别是多少?•在8位、16位、32位ARM系统环境下运行结果分别是多少?•在Turbo

C、keil、GCC-32、GCC-64开发环境下,结果是多少?•使用gcc –m32生成一个32位代码,运行在64位环境下,结果? 使用gcc

–m64生成一个64位代码,运行在32位环境下,结果?

3)自增运算符带来的思考

下面一段程序,在不同的编译器上编译,结果是多少,一样吗?为什么?

i=1,j=2; printf(“%d ”,i++*i++); i+++j;

4)代码分析

使用tc、C-free、GCC、VC++6.0、visual studio分别编译下面代码,会出现什么问题?

int main(){ int i; //定义一个变量 int a[0]; printf("hello world! "); int j;

for(int k=0;k<10;k++); return 0;}

5)在linux环境下,运行下面代码,会出现什么问题?

int * data_copy ( int *p){ int buffer[8192*1024];

memcpy(buffer,p,8192*1024); return buffer;}

6)下面是linux内核代码的一部分(摘自Linux4.4内核),你能看懂多少?

#define stamp(fmt, args...) pr_debug("%s:%i:" fmt " ", __func__, __LINE__,

## args)#define

container_of(ptr, type, member) ({ const typeof(((type *)0)->member)

* __mptr = (ptr); (type *)((char *)__mptr - offsetof(type, member));

})struct urb { … struct usb_iso_packet_descriptor iso_frame_desc[0]; }

urb->transfer_flags &= ~(URB_DIR_MASK | URB_DMA_MAP_SINGLE

|URB_DMA_MAP_PAGE );

本文内容转载自网络,来源/作者信息已在文章顶部表明,版权归原作者所有,如有侵权请联系我们进行删除!

掌握c语言编程是什么程度,学习嵌入式C语言要掌握到什么程度?相关推荐

  1. 有没有c 或c语言的短期培训学校,根河学c语言编程,根河学c语言编程的学校,根河学c语言编程报个培训班怎么样...

    根河学c语言编程,根河学c语言编程的学校,根河学c语言编程报个培训班怎么样 首页 > 软件 > 根河学c语言编程 作者:镀金池   发布时间:2017-11-30 11:02 另外,尽早调 ...

  2. 8051单片机c语言编程模板,完美的8051单片机C语言编程模板.doc

    完美的8051单片机C语言编程模板.doc <8051单片机C语言编程模板> [程序开始处的程序说明] /***************************************** ...

  3. ab st语言编程手册_从零开始学习ST/SCL编程语言:一赋值及条件执行指令的讲解...

    有很多朋友想学习SCL语言,其实不要把SCL或ST语言想的有多高大上. 首先看下什么是SCL语言:SCL语言是一种结构化文本,类似于计算机高级语言的编程方式,他的语言规范解决计算机的PASCAL语言. ...

  4. python语言通俗理解_慢步学习,python语言编程,来扯扯语言的学习理解

    最近慢步工作比较忙,有那么一丢丢挫伤了学习的积极性.积极性受挫的另一个原因是,慢步对自己给读者提供的内容有些困惑,"我能提供什么有价值的内容?" 不断重复书籍的知识点,好像并不能生 ...

  5. 基于c语言编程思路的实践与探索,C语言程序设计趣味教学探索与实践

    张竞丹 王乐 江武汉 范金坪 管明祥 摘要:"C语言程序设计"是高等职业教育中计算机.电子专业的专业基础课程,在其专业课程体系中具有重要的作用.文章针对高职院校"C语言程 ...

  6. c语言 方程改main的值_C语言编程笔记丨编写第一个C语言程序hello world,我教你哇...

    如果用C语言输出:Hello,world!,该如何编写程序? **代码如下:** #include//包含标准库的信息 main()//定义名为main的函数,不接受参数值 {//main函数的语句都 ...

  7. 沈阳工业大学c语言编程题,金融工程专业《C语言程序设计》启发式教学探讨

    一.引言 C语言是一门高级程序设计语言,掌握C语言不仅有利于提高学生的思维能力,而且有利于培养学生的编程能力,对学习其他计算机语言课程具有很大的帮助.因此,<C语言程序设计>既是计算机各类 ...

  8. 红灯停绿灯行c语言编程,基于物联网应用的《C语言程序设计》教学模式研究

    [摘要] 物联网是信息技术的最新发展发向,C语言程序设计又是物联网相关专业中的基础课,在物联网中的应用广泛,本文结合所任教的技工院校学生特点,在分析了C语言教学中存在的问题后,对C语言的教学模式进行了 ...

  9. 数学在c语言编程中的历史,用计算机C语言编程解古代数学题

    用计算机C语言编程解古代数学题 C语言广泛的应用于基础软件.桌面系统.网络通信.音频视频.游戏娱乐等诸多领域.是世界上使用最广泛的编程语言之一本文由论文联盟http://www.LWlm.cOm收集整 ...

最新文章

  1. 【Spring注解系列01】@Configuration与@Bean
  2. SqliteHelper整理(转载)
  3. 连接局域网的SQL Server数据库配置
  4. oauth2 java 获取token_OAuth2 Token 一定要放在请求头中吗?
  5. R︱Linux+Rstudio Server尝鲜笔记(打造最佳Rstudio体验+报错的解决方案)
  6. 动辄几个亿的东半球最强饭局:大佬们都吃了啥?
  7. C语言学习IDE和基本程序结构
  8. css hot loader,怎么针对依赖包的css 单独写一条loader的规则,不开启 css modules
  9. Django实现websocket完成实时通讯,聊天室,在线客服等
  10. 常用印制电路板标准汇总
  11. JAVA并发-Future/CompletableFuture
  12. Linux常用命令——ss命令
  13. 深度学习第55讲:图像的神经风格迁移
  14. 怎样用计算机做ppt,怎样在家用电脑上制作幻灯片?
  15. php 敏感关键词检测,字符串 - PHP 敏感词违法关键字检测 算法方案
  16. openjudge 1.5.18 鸡尾酒疗法
  17. 2021-2027全球与中国金属烤瓷牙冠市场现状及未来发展趋势
  18. win下搭建小程序服务器,win下搭建小程序服务器
  19. mysql 查找相似数据_MySQL性能优化做得好的人,都懂的索引绝技
  20. BoCloud博云作为核心编写单位参与首个微服务标准制定

热门文章

  1. rtth之线程间的通信
  2. [附源码]Python计算机毕业设计大众点评管理系统
  3. 【力扣每日一题】804. 唯一摩尔斯密码词
  4. 端到端模型(end-to-end)与非端到端模型
  5. python使用级数pi的近似值_π近似莱布尼兹级数
  6. java事务是基于数据库的么_详解在Spring Boot中使用数据库事务
  7. 计算机毕设(附源码)JAVA-SSM金牛社区疫情防控系统
  8. vue.js 两个等号 == 和三个等号 ===的区别
  9. 如何将本地代码同步到Gitee(码云)
  10. 用MATLAB进行余弦信号频谱分析