91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

你知道怎么寫簡(jiǎn)單的C代碼?

痞子衡嵌入式 ? 來源:痞子衡嵌入式 ? 作者:痞子衡嵌入式 ? 2022-05-19 11:18 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

不知道大家有沒有這樣的經(jīng)歷,當(dāng)你來到一個(gè)新的公司或者是接手一個(gè)新的項(xiàng)目的時(shí)候,最怕的就是看前任的代碼(外加沒有文檔),最氣人的還是,連簡(jiǎn)單的注釋都沒有多少,每當(dāng)遇到這種情況都想把前任程序員拉出來斃了。

吐槽歸吐槽,誰的新歡不是誰的舊愛呢?自己寫完的項(xiàng)目可能也要交給后來人,那我們可能是想被斃掉的那一位了。我仔細(xì)想了想,可能一切的鍋都得歸于我們寫代碼時(shí)候的炫技。

程序語言都會(huì)提供這樣的或者那樣的特性,這些特性在某些時(shí)候可以幫助我們省些代碼或者在特定情況幫助我們減少失誤帶來的影響。我相信存在即合理,然而語言的有些特性并不是什么好東西,很多特性都經(jīng)不起時(shí)間的考驗(yàn)(代碼的不斷迭代),最后帶來的bug可能很難找到。

還有一點(diǎn),我相信每個(gè)程序員都想要寫好代碼,或者認(rèn)為短小精悍的代碼才算好。我們也會(huì)經(jīng)常吹牛逼說:這個(gè)功能別人要寫100行,我不到一半行就搞定了。不是說不好,但是很多情況,利用語言里的一些特殊構(gòu)造來縮減代碼可能會(huì)讓人難以理解。

也就是說:并不是語言提供什么特性,我們就一定要使用起來。實(shí)際上我們只需要其中很小的一部分功能,就能寫出優(yōu)秀的代碼,實(shí)現(xiàn)特定的功能。

下面我根據(jù)一些經(jīng)驗(yàn),針對(duì)一些有問題的語言特性,規(guī)范一些代碼,為什么這樣能讓代碼更簡(jiǎn)單。

切記不要省略花括號(hào)

這個(gè)相信大家都有體會(huì),也是經(jīng)常會(huì)這么用的,比如:

if(condition1)
action1();

而不是

if(condition1){
action1();
}

這種情況最起碼可以省了一兩行代碼了,而且也還算是很好看。但是這樣也會(huì)經(jīng)常引起一些意想不到的問題,比如,在后面想要多加一句話action2()到這個(gè)if里面,有可能會(huì)把代碼改成:

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

這可不是python,當(dāng)我們都有縮進(jìn)的時(shí)候,潛意識(shí)里肯定是以為它們是在一起的,以為它們只會(huì)在if的條件為真的時(shí)候執(zhí)行,然而action2()卻其實(shí)在if外面,它會(huì)被無條件的執(zhí)行。

看似很簡(jiǎn)單的問題,可能都很容易發(fā)現(xiàn)這個(gè)錯(cuò)誤,但實(shí)際上卻容易被忽視。只要是if-else語句,把花括號(hào)全都打上,就可以不用擔(dān)心漏掉了,相當(dāng)于沒這個(gè)特性,這樣就可以保持完全的一致性,減少不必要的思考。

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

避免使用自增減表達(dá)式(i++,++i,i–,–i)

我們總喜歡騷操作,在我之前寫過的一篇文章中淺析C語言中一些“令人吃驚”的結(jié)構(gòu) ,表明C語言會(huì)同意一些"令人震驚"的結(jié)構(gòu),但實(shí)際上自增減操作表達(dá)式其實(shí)是歷史遺留的設(shè)計(jì)失誤。

像是c = a+++++b;這種類型的表達(dá)式含義比較蹊蹺,非常容易弄錯(cuò),混淆纏繞在一起,把語義搞得烏七八糟。

這種表達(dá)式的結(jié)果可能取決于求值順序,在某種編譯器下能正確運(yùn)行,換一個(gè)編譯器就可能出現(xiàn)離奇的錯(cuò)誤了,當(dāng)然這個(gè)我并沒有驗(yàn)證,但這種看起來太騷了。

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

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

這兩個(gè)表達(dá)式分解成兩步,如果想寫function(++i),可以拆成

i+=1;
function(i);

拆開之后的代碼,含義完全一致,卻清晰很多。到底更新是在取值之前還是之后,一目了然。

當(dāng)然我們也會(huì)有更細(xì)致的爭(zhēng)論,例如:i++或者++i的效率比拆開之后要高,當(dāng)看到這種究根源的結(jié)論我其實(shí)是很感興趣的,但實(shí)際上這些代碼經(jīng)過基本的編譯器優(yōu)化之后,生成的機(jī)器代碼是完全沒有區(qū)別的。

而且自增減表達(dá)式只有在for循環(huán)的update部分、寫成單獨(dú)的一行這兩種情況下才可以安全的使用,這兩種情況是完全沒有歧義的。其余情況需要避免使用,比如用在復(fù)雜的表達(dá)式里面,比如function(i++),function(++i)等等。

合理使用括號(hào)

使用括號(hào)可以確保表達(dá)式的優(yōu)先級(jí),而我們總是不大喜歡在表達(dá)式中添加括號(hào),但是盲目依賴操作符優(yōu)先級(jí)往往得不償失。

當(dāng)然對(duì)于簡(jiǎn)單的加減乘除我們可以使用,比如1+4*9,而不需要寫成1+(4*9),然而在一些稍微復(fù)雜一點(diǎn)的表達(dá)式中我們可能不喜歡括號(hào),比如1<<2+4*9。

當(dāng)然,這也考研我們的基本功,但我相信移位操作<<的優(yōu)先級(jí),大部分人第一眼可能是不大熟悉的,所以這導(dǎo)致了我們?cè)僖淮螐U了多一點(diǎn)腦子或者Google了一下。

由于x << 1相當(dāng)于把x乘以2,那么這個(gè)表達(dá)式可能會(huì)被誤以為(1<<2)+(4*9),然而實(shí)際上<<的優(yōu)先級(jí)比加法+還要低,所以這表達(dá)式其實(shí)相當(dāng)于1<<(2+4*9)

解決這個(gè)問題的辦法,不是要求每個(gè)人都去把操作符優(yōu)先級(jí)表給硬背下來,而是合理的加入括號(hào)。雖然沒有括號(hào)也表示同樣的意思,但是加上括號(hào)就更加清晰了,是不是呢?

總結(jié)

再次聲明,這里只是舉了幾個(gè)簡(jiǎn)單的例子,所謂存在即合理,特性既然存在肯定是在某種特定情況下有用武之地的,這一點(diǎn)我們毋庸置疑。

但實(shí)際到我們自己敲的代碼,或者在工程應(yīng)用中,為了避免花過多的時(shí)間與精力放在這種費(fèi)眼睛、費(fèi)腦子的事情上,是適得其反的。

我們需要寫簡(jiǎn)單的代碼,需要看簡(jiǎn)單的代碼,需要沒有歧義與爭(zhēng)論的代碼,這才是我們的終極目標(biāo),希望本文所闡述的思想對(duì)大家有用處。


			

									

									

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 程序
    +關(guān)注

    關(guān)注

    117

    文章

    3846

    瀏覽量

    85260
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4968

    瀏覽量

    74009

原文標(biāo)題:如何寫簡(jiǎn)單的C代碼?

文章出處:【微信號(hào):pzh_mcu,微信公眾號(hào):痞子衡嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    不懂編程,怎么搞定電子儀表上位機(jī)軟件?零代碼搞定上位機(jī)軟件開發(fā)

    測(cè)試報(bào)告),但因?yàn)椴粫?huì)C、C#、Python等代碼,只能依賴開發(fā)人員,不僅溝通成本高,還容易出現(xiàn)“需求傳達(dá)偏差”,導(dǎo)致開發(fā)出的軟件不符合實(shí)際測(cè)試場(chǎng)景。 源表測(cè)試軟件 很多電子儀表測(cè)試人員都有過類似困擾:明明是
    的頭像 發(fā)表于 01-27 17:19 ?574次閱讀
    不懂編程,怎么搞定電子儀表上位機(jī)軟件?零<b class='flag-5'>代碼</b>搞定上位機(jī)軟件開發(fā)

    C語言回調(diào)函數(shù)原來這么簡(jiǎn)單

    ” 這個(gè)概念,它是回調(diào)函數(shù)能夠?qū)崿F(xiàn)的重要基礎(chǔ)。 1、函數(shù)指針學(xué)習(xí)過C語言的伙伴都知道C語言中的靈魂 — 指針??梢院敛华q豫的說,要檢驗(yàn)對(duì)C
    發(fā)表于 12-30 06:45

    C語言中一些令人震驚的結(jié)構(gòu)介紹

    = a++ + b; 因此, 這段代碼持行后a = 6, b = 7, c = 12。 如果知道答案,或猜出正確答案,做得好。 如果
    發(fā)表于 12-23 08:15

    連載|開發(fā)工具,易安卓讓系統(tǒng)功能調(diào)用像應(yīng)用邏輯一樣簡(jiǎn)單

    通過自研系統(tǒng)封裝庫,易安卓將復(fù)雜的系統(tǒng)控制能力以接口形式開放給開發(fā)者,讓系統(tǒng)功能調(diào)用像應(yīng)用邏輯一樣簡(jiǎn)單。
    的頭像 發(fā)表于 11-27 11:40 ?87次閱讀
    連載|開發(fā)工具,易安卓讓系統(tǒng)功能調(diào)用像<b class='flag-5'>寫</b>應(yīng)用邏輯一樣<b class='flag-5'>簡(jiǎn)單</b>

    C語言的分支結(jié)構(gòu)介紹

    1.簡(jiǎn)單if語句 C語言中的分支結(jié)構(gòu)語句中的if條件語句。 簡(jiǎn)單if語句的基本結(jié)構(gòu)如下: 代碼語言:javascript if(表達(dá)式) { 執(zhí)行
    發(fā)表于 11-25 07:48

    求助,關(guān)于C代碼中的printf打印的疑問求解

    打印的,那么C代碼中的printf打印是如何能被VCS這些仿真工具打印出來的? 我比較容易理解的方式是: 編譯器將C代碼中printf編譯成某些
    發(fā)表于 11-10 07:54

    覺得哪個(gè)軟件verilog體驗(yàn)最好?有什么優(yōu)勢(shì)?

    覺得哪個(gè)軟件verilog體驗(yàn)最好?有什么優(yōu)勢(shì)?請(qǐng)?jiān)谠u(píng)論區(qū)留言跟大家分享一下吧。
    發(fā)表于 11-10 07:47

    知道板卡廠商參與芯片研發(fā)的α階段意味著什么?

    大家都知道芯片很重要,但是否知道一顆芯片從設(shè)計(jì)構(gòu)思到最終量產(chǎn),需要經(jīng)歷怎樣一個(gè)漫長的過程嗎?
    的頭像 發(fā)表于 09-24 17:08 ?7615次閱讀
    <b class='flag-5'>你</b><b class='flag-5'>知道</b>板卡廠商參與芯片研發(fā)的α階段意味著什么?

    HarmonyOSAI編程編輯區(qū)代碼續(xù)

    利用AI大模型分析并理解開發(fā)者在代碼編輯區(qū)的上下文信息或自然語言描述信息,智能生成符合上下文的ArkTS或C++代碼片段。 使用約束 建議在編輯區(qū)內(nèi)已有較豐富上下文,能夠使模型對(duì)編程場(chǎng)景有一定
    發(fā)表于 08-21 15:43

    硬件工程師的 “鄙視鏈” 新動(dòng)向:代碼的,憑啥瞧不起畫圖的?

    “ ?在海外硬件工程師的世界里,一場(chǎng)關(guān)于設(shè)計(jì)靈魂歸屬的“圣戰(zhàn)”已悄然打響。一邊是信奉“所見即所得”、手握鼠標(biāo)精雕細(xì)琢的“畫圖派”;另一邊,則是高舉“代碼即真理”、用鍵盤召喚電路的“碼派”。這不
    的頭像 發(fā)表于 08-06 11:21 ?3570次閱讀
    硬件工程師的 “鄙視鏈” 新動(dòng)向:<b class='flag-5'>寫</b><b class='flag-5'>代碼</b>的,憑啥瞧不起畫圖的?

    HarmonyOS AI輔助編程工具(CodeGenie)代碼續(xù)

    利用AI大模型分析并理解開發(fā)者在代碼編輯區(qū)的上下文信息或自然語言描述信息,智能生成符合上下文的ArkTS或C++代碼片段。 一、使用約束 建議在編輯區(qū)內(nèi)已有較豐富上下文,能夠使模型對(duì)編程場(chǎng)景有一定
    發(fā)表于 07-15 16:15

    從初學(xué)到進(jìn)階:樹莓派上最適合代碼編輯器推薦!

    安裝樹莓派操作系統(tǒng)后,就可以使用Python、Scratch、Java、C/C++等受Linux支持的多種編程語言進(jìn)行編程了。其中,Python是樹莓派上最受歡迎的編程語言。在樹莓派上開展任何項(xiàng)目
    的頭像 發(fā)表于 05-15 16:20 ?1208次閱讀
    從初學(xué)到進(jìn)階:樹莓派上最適合<b class='flag-5'>你</b>的<b class='flag-5'>代碼</b>編輯器推薦!

    DevEco Studio 一個(gè)簡(jiǎn)單的頁面

    一個(gè)簡(jiǎn)單的頁面 說明: 為確保運(yùn)行效果,本文及之后的文檔示例都將以使用DevEco Studio 4.1 Release版本為例。 我們?cè)跇?gòu)建第一個(gè)應(yīng)用程序中新建了一個(gè)名為
    發(fā)表于 04-24 07:36

    別再說的單片機(jī)RAM不夠用了,來看看這個(gè)吧(可下載)

    的數(shù)據(jù)類型-結(jié)構(gòu)體類型,對(duì)代碼中出現(xiàn)的變量進(jìn)行類別的劃分,用構(gòu)造的結(jié)構(gòu)體類型定義結(jié)構(gòu)體變量,在 or 看代碼的時(shí)候,只要看到這個(gè)結(jié)構(gòu)體就能大致的知道其實(shí)現(xiàn)功能,
    發(fā)表于 03-28 14:12 ?0次下載

    為什么學(xué)了C語言,卻不出像樣的項(xiàng)目?

    一些問題:學(xué)了不少語法,指針、數(shù)組、結(jié)構(gòu)體都能看懂,但一到真正程序時(shí)就不知道該如何下手;看了不少教程,甚至能背下來一些代碼模板,但遇到新問題時(shí)還是會(huì)卡?。幌胱鰝€(gè)完整的
    的頭像 發(fā)表于 03-14 17:37 ?925次閱讀
    為什么學(xué)了<b class='flag-5'>C</b>語言,卻<b class='flag-5'>寫</b>不出像樣的項(xiàng)目?