当前位置:首页 > 每日看点

现在大一,请问大家的C语言都是怎么学的??

卡卷网1年前 (2025-01-08)每日看点268

没想到将近十年没写C语言,最近又拾起来重学了。

自从产品部门(嵌入式)转到工程和工具部门后,我基本没再碰过C语言。主要的变成语言转向了C#和Ruy,偶尔也有Python.特别是Ruy,从接触学习后的那刻起,我便喜欢上了这个语言。Ruy的表现力实在是太强了,可以尽情发挥,是我接触过的语言中最接近自然语言表现方式的。特别是在RuyonRails框架中,加持后的RailsDSL写起来效率非常高,往往短短百来行便可以实现一个完整特性的代码。

举个例子,要将一个字符串按照;分割成字符串数组,对每个子串转换成全大写,最后将数组去重。这个需求,Ruy实现起来是什么样子的:

str.split(‘;’).map{|s|s.upcase}.uniq

后来在很多语言都增加了闭包特性拥有类似写法时,Ruy2.0又更近了一步,将上面的语句简化成:

str.split(‘;’).map(&:upcase).uniq

C语言如果想要实现上述功能的话…还是先想想怎么实现一个动态扩容的charstring吧…像Ruy里面的1.week.ago2.days.later这种表现不但能极大的提高编码的生产率,也让写代码变得轻松而快乐。

是的,松本行弘说,他要创造的是让程序员快乐的语言。因此,作为一个从C编程语言转过来的程序员,这种对太鲜明了,也因此对C语言形成了偏见。毕竟,写C太麻烦了。

但这次是全公司开始搞可信变革,软件工程师需要考试认证,特别是大领导钦点让我们带头体验下考试。没办法,只能扛。考试语言有三种可选:C、C++和Ja,Ja基本没写过,首先排除。C和C++我偏向于C++.(我的编程思维倾向于面向对象,面对编程问题我一般首先想到的是如何建模。)但C++也是好久没碰了,加之C++的概念太多,权衡下来决定舍弃,用一两周时间赶紧补补C.

首先要学习C的语言基本知识,除了指针、数组等基本的语法还记得外,很多都忘了。什么字节序、栈、程序段、格式化输出等都重新学起,甚至连malloc的写法都不会了。然后是各种数据结构、算法,从链表到队列,从树到图,从qsort到Dijkstra,逐个补齐。在接下来是编程练习,对程序编译、运行deug,这才算拾回了C。

然后我就想,这里面除了C的语法,大部分是与C关系不太大的数据结构和算法,以及内存等作方面的知识。这十年编程怎么连这些东西都忘了呢。除了业务上对于数据结构和算法并没有太多要求外,还有很大一部分原因是像Ruy这种高级语言屏蔽了很多底层的东西,让程序员只需要关系业务抽象即可。Ruy中Array和Hash可以覆盖99%场景中的数据结构使用,至于算法也基本都在API中提供了,没有的也可以通过RuyGem在线install下来。至于内存等,更是不用心的事。唯一的不足就是,性能……咳咳。

抛弃C后,我是在面向对象的道路上越走越远。凡事都想着抽象、建模,以至于有些场景会被设计得过于复杂。在刚接触设计模式的那段时间,更是对抽象入魔,无论有没有变化的场景,都要抽象出工厂类来创建对象。是应了那句老话:手里拿着锤子,看什么都是钉子。

再回头来看C,方觉得C语言简单到质朴,顿时有亲切了许多。与Ruy的简单不同,Ruy是让人编码时感到简单,用诗句形容即是“楚腰纤细掌中轻”,可以灵活把控。而C给人的感觉是“清水出芙蓉,天然去雕饰。”要正的理解C,才能用好C,“不可亵玩”,否则将自己给带到坑里了。C就是简单的面向过程的编程语言,用C就是想要扣性能,掌控程序和,当然需要很小心的使用。之前有种叫“ModularC”的模块化C编程方法火了一阵,后面貌似较少听说。这种模块封装的思想固然是好的,但有些模式套在C上显得极为复杂;特别是有些实践通过Struct中的函数指针来现实C的抽象,把好端端的C语言搞成了四不像。写C就简单的去写,脑子里映射的是的实现,而不要过分的强调业务抽象。

因此,这次我在重学C后,开始用C实现一些经典的数据结构和算法。这些代码又让我感受到了C语言的美,虽然这些代码如果用Ruy来实现可能要少一半甚至更多,但无论如何是达不到C语言的极致性能体验的,更重要的是,用C来写程序的过程,就是理解的过程。

回到刚才提到的那个问题,如果用C来实现的话,优先考虑的不是像Ruy那样追求代码的极简,而是会追求性能的极简。当然不是说C不关注代码的优雅,对于C而言,算法逻辑是第一位的,所以在循环中总是写++i而不是i++(某些赋值或较场景除外)1。因此,对于这个问题,C的处理方式可能是先对字符串阶段,利用’;’替换成’\0’的方式截断;转换大小写时对小字母值-20(ASCII编码情况下);首尾去空格采用指针偏移的方式;最后去重再用数据结构或算法。当然,可能还有更好的解法。难怪对C情有钟的Linus说:“差的程序员关注代码,好的程序员会关注数据结构和它们的关系。”(”adprogrammersworryaoutthecode.Goodprogrammersworryaoutdatastructesandtheirrelationships.”)

当然C语言还是有不少缺陷存在,如果不谈面向对象,要说C需要增加或调整哪些特性的话,我觉得最重要的是如下几项:

1、命名空间命名空间实现起来不难,但我不明白为什么C99乃至C11新标准没有加上。这个特性可以说是影响大型项目的很重要因素,因为没有命名空间,所有的函数名称都是平行的,命名冲突很常见。为了避免这种冲突,只能编程时人为加上很长也很难看的前缀。

2、私有封装C语言没有Private关键字,Struct所有的成员都是公开的,无法保护内部的数据。而想要实现封装,只能声明和实现分离(.h和.c文件)的方式,但这又会来带理解的复杂度。

3、包C++也缺少这个功能。虽然Conan等第三方工具提供了C/C++的包支持,但到现在为止,仍没有或事实标准的包。这导致C/C++的组件复用很难做,这也是影响生态的重要因素之一。(JaScript这么流行,npm包起了很重要的促进作用。)当然,C/C++编译成二进制码的方式导致了它们使用组件复用也很难,但如果有支持源码复用的一标准包,那么相信C/C++还会增强它们的生命力。而C由于缺乏抽象,可能源码复用也要相对困难些。

我在写一个C的开源库,包含了一些基本的数据结构和算法。这是重新学习的过程,努力向”GoodProgrammer”前行吧。虽然Ruy等高级语言也可以写算法,但用Ruy和用C在思考方式上除了上述不同外,用C更能去理解计算机运行的原理。如同样是写快速排序,Ruy、Python等语言就是用几个数组或list来存储,不会像C那样用指针偏移的方式来做,用C写快排空间复杂度可达S(1),不需要分配内存;而Ruy和Python才不会管这些呢。

扫描二维码推送至手机访问。

版权声明:本文由卡卷网发布,如需转载请注明出处。

本文链接:https://www.kajuan.net/ttnews/2025/01/7360.html

分享给朋友:

相关文章

如果我们没有自己的手机操作系统,会出现所谓的“卡脖子”“安全”问题吗?

如果我们没有自己的手机操作系统,会出现所谓的“卡脖子”“安全”问题吗?

前段时间某某高管在微博发文表示:“其实我觉得,中国人需要的不是一个自己的手机os,而是一个全国产的微信,再搭配一些辅助功能。”这算是“安卓开源”开源的代表了吧。然而打脸来的如此之快,10月30日消息,在Linux内核疑似大规模移除俄罗斯开发…

你是如何在不依靠工资收入的情况下赚到一万元的?

你是如何在不依靠工资收入的情况下赚到一万元的?

分享几个路子稳,门槛低,变现快,适合年轻人的靠谱的副业。绝对不是送外卖、滴滴、搬砖等等的苦力活,这几个副业都是能是性价比极高,还能让你快速成长的工作。 想通过副业实现暴富、立马月入过万的同学,建议速速划走。 今天撇哥就给大家分享 100+个…

如何看待 Luv Letter 表示影视飓风专业性实在是让人失望?

一点儿新进展,另外以下有部分需要关注 对于统一变量的问题。这个我在对比上面有写小字解释,我在一开始使用ffmpeg来控制变量。但是发现了不少问题,比如因为遗留bug,会强制将非整数帧的素材转码为VFR导致无法正确帧间对比,因此不考虑,同时尽…

抖音上有一些账号搬运别人的视频,几乎一模一样,也没判搬运,他们是怎么做到的??

对于任何短视频平台来说,如何用最低的成本快速实现伪原创搬运都是需要解决的问题。 所有的短视频平台,包括抖音、快手、tiktok、视频号、小红书、B站,甚至是FB、推特、INS、YouTube,它们的查重技术都是类似的,只要你在网络环境设置得…

为什么神经网络可以解偏微分方程,是什么原理?

为什么神经网络可以解偏微分方程,是什么原理?

题主一直比较关心神经网络在其他科学领域的应用,比如数学、物理学还有生物学,比如AlphaFold。本次带来的这篇文章傅里叶神经网络算子解偏微分方程就是一个很有意思的方向,其实我自己去年在给美国一个客户做兼职预测数字货币期权价格的时候就用到过…

阿里云服务器续费价格好贵,想换一家云服务厂商,该怎么选择?

阿里云服务器续费价格好贵,想换一家云服务厂商,该怎么选择?

最近一台买了3年时间的腾讯云轻量服务器到期了,还有5天时间。 当时买的价格是3年198元。 配置是2核CPU、4GB内存,80GB SSD云硬盘,1200GB 流量包,然后中途给免费升级了CPU,从2核变成了4核。 平均下来一年的费…

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。