日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁(yè) > > 大橙子瘋嵌入式


前言

這篇重點(diǎn)介紹一下代碼編程規(guī)范的擴(kuò)展要求-表達(dá)式和基本語(yǔ)句規(guī)范要求

要求

【規(guī)范1】賦值語(yǔ)句不要寫(xiě)在if等語(yǔ)句中,或者作為函數(shù)的參數(shù)使用

因?yàn)閕f語(yǔ)句中,會(huì)根據(jù)條件依次判斷,如果前一個(gè)條件已經(jīng)可以判定整個(gè)條件,則后續(xù)條件語(yǔ)句不會(huì)再運(yùn)行,所以可能導(dǎo)致期望的部分賦值沒(méi)有得到運(yùn)行
如:if (test == 15 || HandleLogicFun()) {...},此時(shí)若test = 15,則函數(shù)HandleLogicFun就不會(huì)執(zhí)行

【規(guī)范2】用括號(hào)明確表達(dá)式的操作順序,避免過(guò)分依賴默認(rèn)優(yōu)先級(jí)

  • 使用括號(hào)強(qiáng)調(diào)所使用的操作符,防止因默認(rèn)的優(yōu)先級(jí)與設(shè)計(jì)思想不符而導(dǎo)致程序出錯(cuò);

  • 同時(shí)使得代碼更為清晰可讀,然而過(guò)多的括號(hào)會(huì)分散代碼使其降低了可讀性。

  • 一般代碼行的運(yùn)算符比較多就需要,如果很簡(jiǎn)單必要性不大,反而降低了美觀性


復(fù)合表達(dá)式

【規(guī)范1】不要編寫(xiě)太復(fù)雜的符合表達(dá)式

太復(fù)雜的符合表達(dá)式不利于代碼閱讀
如i = a >= b && c < d && c + f <= g + h,過(guò)于復(fù)雜

【規(guī)范2】不要有多用途的符合表達(dá)式

如d = (a = b + c) + r該表達(dá)式既求a值又求d值,應(yīng)該拆分兩個(gè)獨(dú)立的語(yǔ)句:

a = b + c;
d = a + r;

if 語(yǔ)句

【規(guī)范1】布爾變量與零值比較

不可將布爾變量直接與TRUE、FALSE或者1、0進(jìn)行比較,雖然基本不會(huì)有什么大問(wèn)題,但是會(huì)影響閱讀性
根據(jù)布爾類型的語(yǔ)義,零值為“假” (記為FALSE) ,任何非零值都是“真” (記為TRUE) 。TRUE的值究竟是什么并沒(méi)有統(tǒng)一的標(biāo)準(zhǔn),例如 Visual C++  將TRUE定義為1,而 Visual Basic 則將TRUE定義為-1;因此對(duì)于布爾變量,它與零值比較的標(biāo)準(zhǔn)if語(yǔ)句如下:

if (flag) // 表示 flag 為真 {
} if (!flag) // 表示 flag 為假 {
}

【規(guī)范2】整型變量與零值比較

應(yīng)當(dāng)將整型變量用==或!=直接與0比較。
對(duì)于整型變量,它與零值比較的標(biāo)準(zhǔn)if語(yǔ)句如下:

if (flag == 0)
{
} if (flag != 0)
{
}

【規(guī)范3】浮點(diǎn)變量與零值比較

不可將浮點(diǎn)變量用==或!=與任何數(shù)字比較。

千萬(wàn)要留意,無(wú)論是float還是double類型的變量,都有精度限制。所以一定要避免將浮點(diǎn)變量用==或!=與數(shù)字比較,應(yīng)該設(shè)法轉(zhuǎn)化成>=或<=形式。

假設(shè)浮點(diǎn)變量的名字為x,應(yīng)當(dāng)將if (x == 0.0)// 隱含錯(cuò)誤的比較轉(zhuǎn)化為

if ((x >= -EPSINON) && (x <= EPSINON))
{
 ...
}

【規(guī)范4】指針變量與零值比較

應(yīng)當(dāng)將指針變量用==或!=與NULL比較,雖然和0比較基本不會(huì)有什么大問(wèn)題,但是會(huì)影響閱讀性,誤以為該變量是其它類型
指針變量的零值是“空” (記為NULL) 。盡管NULL的值與0相同,但是兩者意義不同。假設(shè)指針變量的名字為p,它與零值比較的標(biāo)準(zhǔn)if語(yǔ)句如下:

if (p == NULL) // p 與 NULL 顯式比較,強(qiáng)調(diào) p 是指針變量 {
} if (p != NULL) 
{
}

【規(guī)范5】若if有else if分支,則必須有else分支

雖然沒(méi)有else分支,但是在以后的代碼維護(hù)中能清楚表明自己考慮了這種情況,但是目前不需要做任何處理

if (...)
{
 ...
} else if (...)
{
 ...
} else { // TODO }

其中表明注釋 “TODO” 說(shuō)明表明自己考慮了這種情況,但是目前不需要做任何處理

【規(guī)范6】對(duì)于if ("變量" == "常量")通常建議寫(xiě)成if ("常量" == "變量")

好處時(shí)能避免粗心大意寫(xiě)成if ("變量" = "常量"),而編譯可能不會(huì)報(bào)錯(cuò),最終代碼運(yùn)行時(shí)就會(huì)出現(xiàn)異常,而if ("常量" == "變量")這種寫(xiě)法若少了=,根據(jù)常量不能被賦值的規(guī)則,編譯時(shí)就會(huì)報(bào)錯(cuò)。
當(dāng)然這種寫(xiě)法可能不美觀,如果強(qiáng)迫癥,那建議養(yǎng)成習(xí)慣后可以再恢復(fù)if ("變量" = "常量")這種寫(xiě)法,因?yàn)閷?xiě)該語(yǔ)句時(shí)都會(huì)下意識(shí)想到該規(guī)則,從而避免少寫(xiě)=,也能避免粗心引起的該問(wèn)題。

if (5 == test)
{
} if (NULL == pTest)
{
}

for/while/do 循環(huán)語(yǔ)句

循環(huán)語(yǔ)句有for語(yǔ)句,while語(yǔ)句,do語(yǔ)句,其中for語(yǔ)句是使用頻率最高的,以下規(guī)范1、2介紹如何提高for循環(huán)語(yǔ)句的效率,其根本是降低循環(huán)體的復(fù)雜性。


【規(guī)范1】在多重循環(huán)中,如果有可能,應(yīng)當(dāng)將最長(zhǎng)的循環(huán)放在最內(nèi)層,最短的循環(huán)放在最外層,以減少CPU跨切循環(huán)層的次數(shù)

其中第二種就比第一種的運(yùn)行效率要高,光從C代碼角度看,區(qū)別不大,這個(gè)需要從匯編的角度看才能明顯看出,具體可以自行嘗試看執(zhí)行時(shí)間(循環(huán)次數(shù)足夠)看或者網(wǎng)上百度兩種方式的對(duì)比,這里不再描述,網(wǎng)上比較詳細(xì);不過(guò)我建議是直接看兩種編譯后的匯編語(yǔ)句,這樣感觸最深。

// 第一種 for (i = 0; i < 100; i++)
{ for (j = 0; j < 10; j++)
 {
 ...
 }
} // 第二種 for (i = 0; i < 10; i++)
{ for (j = 0; j < 100; j++)
 {
 ...
 }
}

【規(guī)范2】循環(huán)中存在判斷語(yǔ)句等,根據(jù)實(shí)際情況選擇

如以下代碼中判斷表達(dá)式在循環(huán)體中,第二種就效率來(lái)說(shuō)比第一種高,但是就代碼簡(jiǎn)潔性來(lái)看,第一種更好,那么如何取舍呢?

  1. 循環(huán)次數(shù)較少,可以采用第一種,原因是在循環(huán)次數(shù)較少的情況下,第二種的效率提高不明顯

  2. 底層驅(qū)動(dòng)開(kāi)發(fā)時(shí),采用第一種往往會(huì)極大地影響效率,所以普遍采用第二種(之前開(kāi)發(fā)LCD驅(qū)動(dòng)時(shí),畫(huà)點(diǎn)時(shí)第二種比第一種在速度上明顯提高)

// 第一種 for (i = 0; i < 10; i++)
{ if (...)
 {
 ...
 } else {
 ...
 }
} // 第二種 if (...)
{ for (i = 0; i < 10; i++)
 {
 ...
 }
} else { for (i = 0; i < 10; i++)
 {
 ...
 }
}

【規(guī)范3】不能再for循環(huán)體內(nèi)修改循環(huán)變量,防止for循環(huán)失去控制

下列代碼容易失去控制

for (i = 0; i < 10; i++)
{ if (...)
 {
 i += 2;
 } else {
 ...;
 }
}

【規(guī)范4】建議for循環(huán)控制變量的取值采用“半開(kāi)半閉區(qū)間”原則

以下兩種方式功能一樣,但是第一種的寫(xiě)法更加直觀

// 第一種 for (i = 0; i < N; i++)
{
 ...
} // 第二種 for (i = 0; i <= N - 1; i++)
{
 ...
}

【規(guī)范5】空循環(huán)也應(yīng)該使用{}或者continue,而不是一個(gè)簡(jiǎn)單的分號(hào)

這樣做的目的是直觀地看出是一個(gè)空循環(huán)體

for (i = 0; i < N; i++)
{
} while (flag)
{
 condition;
}

switch 語(yǔ)句

【規(guī)范1】每一個(gè)switch語(yǔ)句最后都要寫(xiě)default分支,即使什么也不做

這個(gè)和else if的else分支規(guī)則一樣,目的是在以后的代碼維護(hù)中能清楚表明自己考慮了這種情況,但是目前不需要做任何處理

【規(guī)范2】每個(gè)case語(yǔ)句的結(jié)尾別忘記加break,否則導(dǎo)致多個(gè)分支重疊,除非是有意使多個(gè)分支重疊

建議case和break成對(duì)編寫(xiě),不要寫(xiě)了其他語(yǔ)句再寫(xiě)break,防止遺忘,即使有意重疊,也應(yīng)該這樣做,寫(xiě)完后再刪除break


goto語(yǔ)句

【規(guī)范1】盡量少用,但是我建議禁用更好,對(duì)于程序的閱讀有很大的阻礙,如果必要可以采用do{...}while(0)的方式替代

一般情況goto能解決退出函數(shù)時(shí)需要做的處理,如打開(kāi)文件中間出現(xiàn)錯(cuò)誤都需要關(guān)閉文件,不需要再退出的地方都寫(xiě)

int ReadFileDate(char *pBuf, uint16_t lenth) { if (NULL == pBuf || 0 == lenth)
 { return;
 } if (open(file) == -1)
 { goto EOF;
 } if (read(file, pBuf, lenth) == -1)
 { goto EOF;
 }

 ... // 其他處理,可能也存在錯(cuò)誤需要退出處理(因?yàn)橐呀?jīng)打開(kāi)文件了) EOF:
 close(file);
}


這種方式如果禁用goto,則基本每一個(gè)退出函數(shù)的地方都需要close反而麻煩,此時(shí)可以通過(guò)do{...}while(0)的方式替代

int ReadFileDate(char *pBuf, uint16_t lenth) { if (NULL == pBuf || 0 == lenth)
 { return;
 } do { if (open(file) == -1)
 { break;
 } if (read(file, pBuf, lenth) == -1)
 { break;
 }

 ... // 其他處理,可能也存在錯(cuò)誤需要退出處理(因?yàn)橐呀?jīng)打開(kāi)文件了) } while (0);

 close(file);
}

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
關(guān)閉