0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

你知道怎么写简单的C代码?

痞子衡嵌入式 来源:痞子衡嵌入式 作者:痞子衡嵌入式 2022-05-19 11:18 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

不知道大家有没有这样的经历,当你来到一个新的公司或者是接手一个新的项目的时候,最怕的就是看前任的代码(外加没有文档),最气人的还是,连简单的注释都没有多少,每当遇到这种情况都想把前任程序员拉出来毙了。

吐槽归吐槽,谁的新欢不是谁的旧爱呢?自己写完的项目可能也要交给后来人,那我们可能是想被毙掉的那一位了。我仔细想了想,可能一切的锅都得归于我们写代码时候的炫技

程序语言都会提供这样的或者那样的特性,这些特性在某些时候可以帮助我们省些代码或者在特定情况帮助我们减少失误带来的影响。我相信存在即合理,然而语言的有些特性并不是什么好东西,很多特性都经不起时间的考验(代码的不断迭代),最后带来的bug可能很难找到。

还有一点,我相信每个程序员都想要写好代码,或者认为短小精悍的代码才算好。我们也会经常吹牛逼说:这个功能别人要写100行,我不到一半行就搞定了。不是说不好,但是很多情况,利用语言里的一些特殊构造来缩减代码可能会让人难以理解。

也就是说:并不是语言提供什么特性,我们就一定要使用起来。实际上我们只需要其中很小的一部分功能,就能写出优秀的代码,实现特定的功能。

下面我根据一些经验,针对一些有问题的语言特性,规范一些代码,为什么这样能让代码更简单。

切记不要省略花括号

这个相信大家都有体会,也是经常会这么用的,比如:

if(condition1)
action1();

而不是

if(condition1){
action1();
}

这种情况最起码可以省了一两行代码了,而且也还算是很好看。但是这样也会经常引起一些意想不到的问题,比如,在后面想要多加一句话action2()到这个if里面,有可能会把代码改成:

if(condition1)
action1();
action2();

这可不是python,当我们都有缩进的时候,潜意识里肯定是以为它们是在一起的,以为它们只会在if的条件为真的时候执行,然而action2()却其实在if外面,它会被无条件的执行。

看似很简单的问题,可能都很容易发现这个错误,但实际上却容易被忽视。只要是if-else语句,把花括号全都打上,就可以不用担心漏掉了,相当于没这个特性,这样就可以保持完全的一致性,减少不必要的思考。

if(condition1){
action1();
action2();
}

避免使用自增减表达式(i++,++i,i–,–i)

我们总喜欢骚操作,在我之前写过的一篇文章中浅析C语言中一些“令人吃惊”的结构 ,表明C语言会同意一些"令人震惊"的结构,但实际上自增减操作表达式其实是历史遗留的设计失误。

像是c = a+++++b;这种类型的表达式含义比较蹊跷,非常容易弄错,混淆缠绕在一起,把语义搞得乌七八糟。

这种表达式的结果可能取决于求值顺序,在某种编译器下能正确运行,换一个编译器就可能出现离奇的错误了,当然这个我并没有验证,但这种看起来太骚了。

如果你想写function(i++),你完全可以把它拆成

intt=i;
i+=1;
function(t);

这两个表达式分解成两步,如果想写function(++i),可以拆成

i+=1;
function(i);

拆开之后的代码,含义完全一致,却清晰很多。到底更新是在取值之前还是之后,一目了然。

当然我们也会有更细致的争论,例如:i++或者++i的效率比拆开之后要高,当看到这种究根源的结论我其实是很感兴趣的,但实际上这些代码经过基本的编译器优化之后,生成的机器代码是完全没有区别的。

而且自增减表达式只有在for循环的update部分写成单独的一行这两种情况下才可以安全的使用,这两种情况是完全没有歧义的。其余情况需要避免使用,比如用在复杂的表达式里面,比如function(i++),function(++i)等等。

合理使用括号

使用括号可以确保表达式的优先级,而我们总是不大喜欢在表达式中添加括号,但是盲目依赖操作符优先级往往得不偿失。

当然对于简单的加减乘除我们可以使用,比如1+4*9,而不需要写成1+(4*9),然而在一些稍微复杂一点的表达式中我们可能不喜欢括号,比如1<<2+4*9

当然,这也考研我们的基本功,但我相信移位操作<<的优先级,大部分人第一眼可能是不大熟悉的,所以这导致了我们再一次废了多一点脑子或者Google了一下。

由于x << 1相当于把x乘以2,那么这个表达式可能会被误以为(1<<2)+(4*9),然而实际上<<的优先级比加法+还要低,所以这表达式其实相当于1<<(2+4*9)

解决这个问题的办法,不是要求每个人都去把操作符优先级表给硬背下来,而是合理的加入括号。虽然没有括号也表示同样的意思,但是加上括号就更加清晰了,是不是呢?

总结

再次声明,这里只是举了几个简单的例子,所谓存在即合理,特性既然存在肯定是在某种特定情况下有用武之地的,这一点我们毋庸置疑。

但实际到我们自己敲的代码,或者在工程应用中,为了避免花过多的时间与精力放在这种费眼睛、费脑子的事情上,是适得其反的。

我们需要写简单的代码,需要看简单的代码,需要没有歧义与争论的代码,这才是我们的终极目标,希望本文所阐述的思想对大家有用处。


			

									

									

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 程序
    +关注

    关注

    117

    文章

    3836

    浏览量

    84767
  • 代码
    +关注

    关注

    30

    文章

    4942

    浏览量

    73160

原文标题:如何写简单的C代码?

文章出处:【微信号:pzh_mcu,微信公众号:痞子衡嵌入式】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    连载|开发工具,易安卓让系统功能调用像应用逻辑一样简单

    通过自研系统封装库,易安卓将复杂的系统控制能力以接口形式开放给开发者,让系统功能调用像应用逻辑一样简单
    的头像 发表于 11-27 11:40 87次阅读
    连载|开发工具,易安卓让系统功能调用像<b class='flag-5'>写</b>应用逻辑一样<b class='flag-5'>简单</b>

    C语言的分支结构介绍

    1.简单if语句 C语言中的分支结构语句中的if条件语句。 简单if语句的基本结构如下: 代码语言:javascript if(表达式) { 执行
    发表于 11-25 07:48

    求助,关于C代码中的printf打印的疑问求解

    打印的,那么C代码中的printf打印是如何能被VCS这些仿真工具打印出来的? 我比较容易理解的方式是: 编译器将C代码中printf编译成某些
    发表于 11-10 07:54

    觉得哪个软件verilog体验最好?有什么优势?

    觉得哪个软件verilog体验最好?有什么优势?请在评论区留言跟大家分享一下吧。
    发表于 11-10 07:47

    知道板卡厂商参与芯片研发的α阶段意味着什么?

    大家都知道芯片很重要,但是否知道一颗芯片从设计构思到最终量产,需要经历怎样一个漫长的过程吗?
    的头像 发表于 09-24 17:08 7274次阅读
    <b class='flag-5'>你</b><b class='flag-5'>知道</b>板卡厂商参与芯片研发的α阶段意味着什么?

    HarmonyOSAI编程编辑区代码

    利用AI大模型分析并理解开发者在代码编辑区的上下文信息或自然语言描述信息,智能生成符合上下文的ArkTS或C++代码片段。 使用约束 建议在编辑区内已有较丰富上下文,能够使模型对编程场景有一定
    发表于 08-21 15:43

    硬件工程师的 “鄙视链” 新动向:代码的,凭啥瞧不起画图的?

    “  在海外硬件工程师的世界里,一场关于设计灵魂归属的“圣战”已悄然打响。一边是信奉“所见即所得”、手握鼠标精雕细琢的“画图派”;另一边,则是高举“代码即真理”、用键盘召唤电路的“码派”。这不
    的头像 发表于 08-06 11:21 3248次阅读
    硬件工程师的 “鄙视链” 新动向:<b class='flag-5'>写</b><b class='flag-5'>代码</b>的,凭啥瞧不起画图的?

    从初学到进阶:树莓派上最适合代码编辑器推荐!

    安装树莓派操作系统后,就可以使用Python、Scratch、Java、C/C++等受Linux支持的多种编程语言进行编程了。其中,Python是树莓派上最受欢迎的编程语言。在树莓派上开展任何项目
    的头像 发表于 05-15 16:20 798次阅读
    从初学到进阶:树莓派上最适合<b class='flag-5'>你</b>的<b class='flag-5'>代码</b>编辑器推荐!

    别再说的单片机RAM不够用了,来看看这个吧(可下载)

    的数据类型-结构体类型,对代码中出现的变量进行类别的划分,用构造的结构体类型定义结构体变量,在 or 看代码的时候,只要看到这个结构体就能大致的知道其实现功能,
    发表于 03-28 14:12 0次下载

    为什么学了C语言,却不出像样的项目?

    一些问题:学了不少语法,指针、数组、结构体都能看懂,但一到真正程序时就不知道该如何下手;看了不少教程,甚至能背下来一些代码模板,但遇到新问题时还是会卡住;想做个完整的
    的头像 发表于 03-14 17:37 688次阅读
    为什么学了<b class='flag-5'>C</b>语言,却<b class='flag-5'>写</b>不出像样的项目?

    map指令简单介绍

    当然这里的都是官方文档是已经写过的,我简单抄一下哈。
    的头像 发表于 02-13 09:54 682次阅读

    代码加密、源代码防泄漏c/c++与git服务器开发环境

    代码加密对于很多研发性单位来说是至关重要的,当然每家企业的业务需求不同所用的开发环境及开发语言也不尽相同,今天主要来讲一下c++及git开发环境的源代码防泄密保护方案。企业源代码泄密
    的头像 发表于 02-12 15:26 890次阅读
    源<b class='flag-5'>代码</b>加密、源<b class='flag-5'>代码</b>防泄漏<b class='flag-5'>c</b>/<b class='flag-5'>c</b>++与git服务器开发环境

    分析C语言代码结构的设计问题

    来分析一个C语言代码结构的设计问题。 这段代码,使用了两次malloc,分别给 p1 和 p2 申请了内存。用完后,内存释放,防止内存泄漏。 大家觉得,这样的代码设计有没有问题。
    的头像 发表于 02-11 09:31 680次阅读

    什么样的代码会被编译器优化

    现在的编译器有多智能,可能辛辛苦苦代码,在编译器看来就是几句废话,直接被删除掉。
    的头像 发表于 01-16 16:38 937次阅读

    AN-840: 通过I2C接口更新代码

    电子发烧友网站提供《AN-840: 通过I2C接口更新代码.pdf》资料免费下载
    发表于 01-15 16:04 0次下载
    AN-840: 通过I2<b class='flag-5'>C</b>接口更新<b class='flag-5'>代码</b>