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

當前位置:首頁 > > 大橙子瘋嵌入式


前言

這篇重點介紹一下代碼編程規(guī)范的擴展要求-表達式和基本語句規(guī)范要求

要求

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

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

【規(guī)范2】用括號明確表達式的操作順序,避免過分依賴默認優(yōu)先級

  • 使用括號強調(diào)所使用的操作符,防止因默認的優(yōu)先級與設計思想不符而導致程序出錯;

  • 同時使得代碼更為清晰可讀,然而過多的括號會分散代碼使其降低了可讀性。

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


復合表達式

【規(guī)范1】不要編寫太復雜的符合表達式

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

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

如d = (a = b + c) + r該表達式既求a值又求d值,應該拆分兩個獨立的語句:

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

if 語句

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

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

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

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

應當將整型變量用==或!=直接與0比較。
對于整型變量,它與零值比較的標準if語句如下:

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

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

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

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

假設浮點變量的名字為x,應當將if (x == 0.0)// 隱含錯誤的比較轉化為

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

// 第一種 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)中存在判斷語句等,根據(jù)實際情況選擇

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

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

  2. 底層驅(qū)動開發(fā)時,采用第一種往往會極大地影響效率,所以普遍采用第二種(之前開發(fā)LCD驅(qū)動時,畫點時第二種比第一種在速度上明顯提高)

// 第一種 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)控制變量的取值采用“半開半閉區(qū)間”原則

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

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

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

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

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

switch 語句

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

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

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

建議case和break成對編寫,不要寫了其他語句再寫break,防止遺忘,即使有意重疊,也應該這樣做,寫完后再刪除break


goto語句

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

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

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;
 }

 ... // 其他處理,可能也存在錯誤需要退出處理(因為已經(jīng)打開文件了) EOF:
 close(file);
}


這種方式如果禁用goto,則基本每一個退出函數(shù)的地方都需要close反而麻煩,此時可以通過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;
 }

 ... // 其他處理,可能也存在錯誤需要退出處理(因為已經(jīng)打開文件了) } while (0);

 close(file);
}

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