一些C语言学习的思考

吐血整理C语言学习路线,萌新到大牛,要看哪些书? 这篇文章实际上是我自己入门过程的总结,一个尽量少废话的C语言入门指南。 文章最后有彩蛋~记得看完???? 在众多的编程语言中,有各种各样的语言,但大多数语言都离不开这两种语言:C语言和C++。 C语言最牛逼的地方在于开发出来了linux内核。编程语言纷繁多样,JAVA、Python、PHP、JavaScript、Lisp、Ruby、Go、C#… …不计其数。 但是, 这些语言用C实现,运行在C实现的系统中,他们的发明人都是C大牛。C 是 Matrix. 尽管你可能察觉不到它的存在,它却无处不在。 找一份工 阅读详情

    带着问题思考是最有效的,下面的问题摘录自http://stackoverflow.com/的C语言tag,这个阅读的过程伴随着自己的一些思考。浏览网页时,单单从问题本身以及阅读网友的评论和回答只能是帮助明白这个问题,深层次的消化总结才能将其应用于实际研发工作中,这里记录下来,聊作共享。

1

问题一开始让人疑惑:

#include <stdio.h> 
int main() 
{ 
     
int x =10; 
     
while( x-->0)// x goes to 0 
     
{ 
       printf
("%d ", x); 
     
} 
}

提问的人最开始强调自己遇到一个新的运算符“-->”,问有人知道在标准里面哪个位置有说明。后面解释了是“x--”书写的时候在x和自减运算符之间添加了空格,是书写风格的问题,显然提问人是有意为之。然而真正让我感兴趣的是回答问题和评论的人。遇到这种问题,有两种回答方式,一部分人选择正儿八经地回答是因为编码风格不好导致,然后给出其它复杂的情况,显得很专业;另外一部分人开始恶搞了,更有甚者上升到理论高度,“一本正经”认为这样的书写减少大脑思考时间,让人愉悦。

总结:偶尔恶搞式的提问能够增添乐趣,程序员的幽默是来自内心的。为了集思广益,我们在很多时候还真需要这种恶搞精神。

 

2

常见的问题,一个家伙问:C语言的解析器是开源的不,能看到其源代码不?不同的编译器是不是针对不同的C语言? stdlib又是什么?

弄清楚这些问题,就等同于理解了编程语言与编译工具之间的关系,更可以说理解了C语言到底是怎么执行的,感谢stallman,赐予我们GCC。另外stdlib是标准C函数库,几乎所有的编译工具都会支持,例如gcc对它的实现,读懂了它没准你也会写函数库了。

总结:目前有种趋势是标准与工程实现同步的情况,也许未来语言标准这个概念可能会跟今天大相径庭,出现拥有源代码的KK语言。

 

3

你为什么要学习C语言?

C语言从诞生到如今已经有40来年了,它被认为是一种低层次语言,从传统的汇编语言过度到C语言的学习比较容易。另外好多程序员学习这门语言的经历应该说是从大学开始,由于时间原因,选择C语言作为教材是因为比起Pascal等语言来说,它更简单、更符合人的思维。当然还有一些程序员是因为工作的原因需要去掌握它,毕竟很多嵌入式研发需要使用C语言。

有人发出感叹“study for girls”,好吧,这也是很重要的一个原因!

总结:未来的趋势是了解多门程序语言,精通一门,你准备精通哪一门?机器语言:)

  

4

写一个程序,不用循环和条件语句,打印1到1000?

但凡遇到这种问题,相信很多人会很不屑,这种问题在正式研发中从来都不是问题,因为没有人会不用循环和条件语句,俗话说:简单为美,能够使用为什么不用?但是不要低估程序员,他们总能找到新的解决办法,他们都是聪明和富有想象力的。

例如,递归的方法

#include <stdio.h>
int f(int val) {
    --val && f(val);
    return printf( "%d\n", val+1);
}
void main(void) {
    f(1000);
}


又比如,多级表示,对于1000这样数量级是有效的,例如Linux下页表的存储就采用这种原理

#include <stdio.h>
int i = 0;
p()    { printf("%d\n", ++i); }
a()    { p();p();p();p();p(); }
b()    { a();a();a();a();a(); }
c()    { b();b();b();b();b(); }
main() { c();c();c();c();c();c();c();c(); return 0; }


玩玩文字游戏,这问题不就是Print "numbers from 1 to 1000",脑筋急转弯!
printf("numbers from 1 to 1000");
还有,能不能看成是二进制数字啊?
printf("1 10 11 100 101 110 111 1000\n");


总结:一直强调发散思维,其实无论是做研发还是生活,多点发散思维真的会平添很多乐趣

 

5 C语言背后的使用特性

更准确地说是一种大家在开发的时候用到的技巧,因为C语言本身是一门程序语言,其特性都是一致的。编译器则不一样,并不是所有的C语言编译器是兼容的,例如gcc和MSVC编译器,但是在实际研发当中,我们都会使用一些不是那么显而易见的技巧,例如:

利用函数指针数组来模拟面向对象的思想,提高效率;

可以使用标准函数库中提供的qsort()快速排序函数;

GNU系统中可以使用宏unlikely()来包含条件,编译时将这部分不常碰到的逻辑放在不影响效率的地方;

printf中的%n格式串;

结构体的末尾声明char buffer[1],使得结构体大小能够动态增减;

调试时打印语句使用__LINE__和__FILE__;

总结:实际研发中,尽量少使用一些编译器特性的内容,提高移植性。当然,具体情况具体分析,如果使用gcc编译器的话,应该多多掌握gcc提供的一些特性。总而言之,好的设计和算法才是程序的灵魂,C语言的灵活性仅仅是一些实现我们设计的trick,遇到之后记录就是。

 

6 寻找项目中有用的模块

几乎所有的项目都会有一些“utility”模块,utility模块会被其他模块所调用,自成一派:

#define ITEMSOF(arr) (sizeof(arr)/sizeof(0[arr])),获取数组的大小,0[arr]的写法是为了防止在面向对象语言C++中出现[ ]重载的情况

#define ever ;;

for (ever) {...},啥都不说了,就为了便于理解

void hex(void *ptr, int buflen);打印出ptr指向的长度为buflen的内存内容,便于调试,函数体自己可以写

#ifdef NDEBUG 
#define Dprintf(format,...) 
#else 
#define Dprintf(format,...)\ 
    fprintf
(stderr,"[%s]:%s:%d: " format, __FILE__,\ 
        __func__
, __LINE__,##__VA_ARGS__) 
#endif,这种宏使用方式用来插入一些打印语句比较不错

总结:这样的模块我们经常会碰到,遇到之后记录下来,减少今后的工作量,实际上软件工程的核心思想就是迭加,积少成多。

 

7

const是新增的C语言标准,例如在C99中推荐使用。C程序员在很多时候还是使用#define而不是const。在C语言中,const只是代表这个变量是只读的,而在C语言编写的大型项目中,常常需要对某个常量重新赋值,这时候采用#define显得比较灵活,也就是覆盖或者#undefine操作。另外#define和const在编译器进行处理的时候阶段也不一样,前者发生在预编译阶段,后者往往在连接阶段才会被编译器解析。

总结:研发中某些时候尽量遵守传统的习惯,并不是因为新的东西不好,而是技术上传统的东西稳定,有这么做的道理,不容易出错。


8

很有意义的问题:一个优秀的C开发人员应该能够回答哪些问题:

char *p="Sam"; p[0]='R';这段代码有什么错误?

能快速写出strcpy()函数?

比起这么多高级语言,你为什么选用C语言来开发?

malloc()在什么时候会失败?

如何声明整数指向某个地址,并对地址进行操作?

void指针能做些什么?

。。。。。。

总结:讨论是没有结尾的,开发的时候多问自己为什么,相信研发能力的提升会非常快。

 

9

这么多高级语言,学习C语言有必要吗?

这个问题很难解答,一百个人的眼中有一百个哈姆雷特,这里仅仅把论坛上的一些回答罗列出来,看了后应该能做出抉择:

学习C语言后能够更好地理解其他语言程序的运行原理,能够不断重构,使程序更快更短;

MCU很有趣,用C语言;

很多核心框架用C语言写的;

back to basics;

从事技术,你就从了C语言,从事业务,你就从了C#;

总结:很多情况下,基础牢靠与否是个永恒的话题,并不是你掌握了C语言就能更好地使用面向对象语言,或者说掌握了C语言就能独善其身,更多时候要看你是否有追求技术创新的激情。也许当你在纠结于是否要精通C语言的同时,脚本语言在一旁偷笑呢。。。

(2011年9月21日晚)


 

谭浩强C语言(第三版)习题5.7 题目描述 给出一个不多于5位的整数,要求 1、求出它是几位数 2、分别输出每一位数字 3、按逆序输出各位数字,例如原数为321,应输出123 输入描述 一个位数不超过5位的数字 输出描述 输出共3行 第1行 描述数字的位数 第2行 用空格分开的每个数字,注意最后一个数字后没有空格 第3行 按逆序输出这个数 样例输入 12345 样例输出 5 1 2 3 4 5 54321 提示 哈姆雷特:数字还是... 阅读详情

相关推荐

Scilab的初步介绍

一项软件或者技术可能出现较早,但成熟应用或者受到重视往往需要经过较长时间,一方面是因为软件本身的稳定性有时间规律性,另一方面则是因为人们对于某个事物的接受需要过程性。随着博主研究的深入和各种阅历的增长,对于轻量级软件的爱好日益加深。它们能够完成大型软件的部分功能,且满足用户需求,专注于某个技术领域。Scilab是一款较为知名的开源软件,从易用性和易安装性等方面考虑,可以作为工程师或科研工作者的一个

betterlord的专栏 1万+

在学习中思考——C语言学习总结小记2021.12.19

在学习中思考——Hello各位!欢迎来到一飞的博客!正如标题所言,在C语言的学习中,加入自己独特的思考非常重要!

m0_62943985的博客 1649

Word多级标题出现黑块的解决思路(word 数字必须介于1-1638之间)

遇到多级目录出现黑块问题,看到一篇博客完美解决,在此记录。

AI_Optimization的博客 3651

关于c语言程序设计的想法,关于《C语言程序设计》学习的几点思考

摘 要:C语言是大学阶段一门必修课程,是许多理工科高校的核心课程之一。学好C语言对个人今后的专业发展和自身发展有着深远的影响。本文对《C语言程序设计》课程学习提出了几点建议,以期抛砖引玉。关键词:C语言 代码 思考中图分类号:G642 文献标识码:A 文章编号:1672-1578(2018)10-0048-011 引言在大学阶段,C语言不仅是计算机专业而且也是非计算机专业学习计算机基础的一门必修课...

weixin_31721961的博客 1274

C语言思考

<br />最近公司在面试新的工程师,结果差强人意。<br /> <br />感觉虽然候选人都有较长的工作时间,但是对概念的理解还是不是很精确。自己反省了一下自己的知识结构,还有很多的东西要学呀。<br /> <br />比如 c99中bool变量的使用等:)接下来的几个月要好好的系统的看基本书,先完成Orange'S操作系统的这本书再说。<br /> <br />加油张大猪!

慢慢来,不急;) 658

c语言学习上的思考心得

由于这段时间在c语言的学习中,表现的很努力并且完成作业态度认真,所以得到了老师奖励的小黄衫。 以下是我对于c语言的学习感受心得。 学习感受心得 我选择计算机的这个专业,是因为我对计算机的学习很有兴趣。c语言是我以前从来没有接触过、也没有了解过的,所以当我知道要学习c语言的时候,我是有一些紧张的。当我看到书上的一堆代码,我害怕学不会,学不懂。但当我上完第一次课时,我发现c语言其实...

weixin_30585437的博客 590

那些年,C给我们留下的思考——换一种角度重释C语言

换一种角度认识C语言——以汇编来探索C探索环境及工具探索内容变量篇全局变量和局部变量到底是什么,为什么全局变量可以不用初始化,而局部变量必须初始化无符号和有符号到底是怎么辨别同样都是4个字节,为什么float比int存储的范围大那么多C语言中的枚举底层实现,为什么要有枚举类型,函数篇函数的参数到底是怎么传递的,值传递和地址传递到底是怎么一回事函数中涉及的堆、栈到底又是什么分支语句篇同样是分支语句,为什么条件多的

qq_45967311的博客 2355

大学c语言作业会认真检查么,c语言学习上的思考心得

由于这段时间在c语言的学习中,表现的很努力并且完成作业态度认真,所以得到了老师奖励的小黄衫。以下是我对于c语言的学习感受心得。学习感受心得我选择计算机的这个专业,是因为我对计算机的学习很有兴趣。c语言是我以前从来没有接触过、也没有了解过的,所以当我知道要学习c语言的时候,我是有一些紧张的。当我看到书上的一堆代码,我害怕学不会,学不懂。但当我上完第一次课时,我发现c语言其实并没有想象中的那么遥远...

weixin_30546683的博客 510

C语言学习角度新思考

C语言综述 C语言的强大生命力,相信只要学过或是看过相关的书,那么书本第一章介绍历史时必然会提及到,在次不再赘诉。作为一门最基础的高级语言,也是我的入门语言。由于个人一些原因,现在得重新拿起来学一遍。当然是站在也学习了一些其他语言的基础上,希望能够以另外的角度,重新审视回顾吧。 学习角度 之前好像看到过一篇科学文章是指人的短暂记忆是十分有限,一般在学习新知识,或是观看一篇文章,一场演讲时,只...

Armmyer的博客 318

大一寒假c语言学习思考2

枚举结构

gking_1的博客 115

关于c语言学习中二维数组指针的思考

a[i]为a[i]的地址即数组a的地址+i(由于a的指针类型为int(*)[4]型,因此a+i实际上a+i*4),而由数组存储方式可得,恰好为从首个开始数跳过第i*4个元素的地址,即a[i][0]的地址,恰好等于a[i]。定义a[i]中的存储值为a[i][0]的地址,其指针类型为int*型。二者随地址相同,但指针变量不同,不能混用。个人理解,如果有误,欢迎各位大佬指出。对数组a[3][4]来说,

2403_87738737的博客 445

c语言全局变量可以是数组吗_C语言学习笔记

这篇笔记不是C语言的学习教程,不是书上能看到的,也不是网上的教学视频会讲的,全是对C语言的个人学习的深入思考总结,全是脑洞干货,每一个问题的解决和结论的得出都基于代码实现的验证......很多人说C语言中一切都是指针,我说:C语言中一切都是地址。我们看不见数据的内存地址,但是通过给特定的地址起个名字,我们就具备了操作这个地址的能力。 C语言数据类型变量作用域内存区间 内存空间分配图一般情况下...

weixin_39638305的博客 3722

语言向自定数组_C语言学习笔记

这篇笔记不是C语言的学习教程,不是书上能看到的,也不是网上的教学视频会讲的,全是对C语言的个人学习的深入思考总结,全是脑洞干货,每一个问题的解决和结论的得出都基于代码实现的验证......很多人说C语言中一切都是指针,我说:C语言中一切都是地址。我们看不见数据的内存地址,但是通过给特定的地址起个名字,我们就具备了操作这个地址的能力。 C语言数据类型变量作用域内存区间 内存空间分配图一般情况下...

weixin_42514750的博客 122

C语言思考

C语言学习思考 学习经历 作为一个工科生,我从大一就开始接触C语言这门编程语言,也知道这门语言很重要。但是,在校内的课程里,老师主要是按照书上的内容来讲解,而且更多的关注理论的讲解,而让同学们进行实操的环境往往是蜻蜓点水一带而过。因此,上完c语言这门课程之后,就值记住一点基本的语法。 而到了大二的学习,或多或少会去接触一些项目的学习,比如单片机的学习,一些实践课程。这些都要求我们对C语言有扎实的功底,虽然你多加练习之后可能可以顺利完成这些课程,但是如果你要使用指针、动态内存分配等知识时,你总是无从下手,甚至

cjh98fight的博客 300

路由器中路由表和转发表的差异

路由器对网络中的数据进行处理,其处理依赖于路由表(Routing Table)和转发表(Forwarding Table),它们的意义在于体现了通信网络中的“数据在设备中做什么”和“数据离开设备后到哪里去”。         从概念上区分它们并不容易,因为转发表实际上是由路由表生成的,它们都是转发报文的一组规则集,只不过路由表更为抽象和复杂,转发表更为具体和简单。转发表的来源是通信网络中的交换机

betterlord的专栏 9634

路由器对IP报文的分片

网络协议栈中,各个层次都具有其最大传输单元值(MTU),上层的数据依赖于下层可以容纳的MTU,例如在以太网环境中,帧中允许携带的IP分组最大为1500字节,如果IP分组大小超出网络允许传输数据的最大值,则需要对IP分组进行分片。路由设备针对IP分组进行处理,这里以IP报文为例,说明这一分片过程。 图中,R0到R1的链路所能传输的最大IP分组大小大于R1到R2的链路,这时候路由器R1需要对IP

betterlord的专栏 8481

SRS信号的时频资源配置

3GPP标准协议规范TS 38.211 6.4.1.4定义了SRS信号的生成,包括SRS信号配置、符号和索引位置、OFDM时频资源网格映射和SRS波形生成。SRS信号主要分为三种应用模式: 1)全带宽传输 2)跳频传输 3)多用户传输 SRS(Sounding Reference Signals)信号是用户终端UE在上行链路发送的参考信号,主要应用于信道质量估计和同步。 ...

betterlord的专栏 6342

可重入程序不可重入程序的区分

可重入性的英文关键词为Reentrancy,这里首先要区分可抢占这一概念。在计算机里面,程序的运行可以说是一堆机器指令被放入CPU进行顺序执行,但是操作系统为了更好地管理程序,就出现了各式各样的载体概念,比如说进程、线程、任务,究其本质,都是相对于“调度”这个操作,它们只是调度的

betterlord的专栏 5078

基于轻量化网络的干扰信号智能识别算法

针对干扰信号识别时卷积神经网络模型体积大、训练周期长、对硬件存储和计算要求高等问题,本 文提出了一种基于改进轻量级网络模型 SqueezeNet 的干扰信号智能识别算法。该方法首先利用距离多普勒 (Range‑Doppler,RD)处理获得目标及干扰信号的RD图像,接着采用滑窗变换、归一化等技术对RD图像进行重 塑;然后采用基于 RD 信息尺寸的隐层和通道剪枝措施对 SqueezeNet 网络进行改进,缩小了模型尺寸和存储空 间;最后利用不同参数的测试样本拓展网络模型的泛化性能。

qq_43416206的博客 516

【工业自动化】集成V12-V21西门子博途软件虚拟机系统:Win10系统

内容概要:本文介绍了一个包含西门子博途(TIA Portal)V12至V21所有版本软件的虚拟机系统,该系统已预先配置在Windows 10环境中,适合人群:从事工业自动化、PLC编程及相关技术工作的工程师、技术人员及学习者,特别是需要使用多个版本西门子博途软件的用户。; 使用场景及目标:①用于学习和掌握西门子TIA Portal各版本的功能差异;②支持项目开发中对特定版本软件的需求;③节省安装配置时间,提供开箱即用的集成环境; 阅读建议:下载前请确保有足够的存储空间(210GB)和稳定的网络连接,建议拥有网盘超级会员以提升下载速度;使用时注意虚拟机运行性能需求,推荐高配置主机以保障流畅运行。

上一篇: C Puzzle解答(2)
下一篇: C程序的内存结构
betterlord
博客等级 码龄15年 18粉丝 26原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值