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

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

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

C語言/C++基本語句編程風(fēng)格

GReq_mcu168 ? 來源:玩轉(zhuǎn)單片機(jī) ? 2020-08-05 11:03 ? 次閱讀

初學(xué)者階段編程時(shí),編寫基本語句可能會(huì)有隱含錯(cuò)誤的方式,基本語句主要針對(duì)if、for、while、goto、switch等,它們看似簡(jiǎn)單,但使用時(shí)隱患比較多,本文歸納了使用語句的一些規(guī)則和建議。

基本語句編程舉例

if語句

if語句是C++/C語言中最簡(jiǎn)單、最常用的語句,然而很多編程人員用隱含錯(cuò)誤的方式寫if語句,本文以“與零值比較”為例,進(jìn)行討論。

(1)布爾變量與零值比較:不可將布爾變量直接與TRUE、FALSE或者1、0比較。根據(jù)布爾類型的語義,零值為“假”(記為FALSE),任何非零值都是“真”(記為TRUE)。TRUE的值究竟是什么并沒有統(tǒng)一的標(biāo)準(zhǔn),

例如VC++將TRUE定義為1,而VB則將TRUE定義為-1。

假設(shè)布爾變量名為flag,它與零值比較的標(biāo)準(zhǔn)if語句如下

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

其他的用法都屬于不良風(fēng)格,例如:

if(flag == TRUE) if(flag == FALSE) if(flag == 1 ) if(flag == 0 )

(2)整型變量與零值比較:應(yīng)當(dāng)將整型變量用“==”或“!=”直接與0比較。假設(shè)整型變量的名字為value,它與零值比較的標(biāo)準(zhǔn)if語句如下:

if(value == 0) if(value != 0)

不可以模仿布爾變量的風(fēng)格而寫成:

if(value) if(!value) //會(huì)讓人誤解value是布爾變量

(3)浮點(diǎn)變量與零值比較:不可以將浮點(diǎn)變量用“==”或“!=”與任何數(shù)字比較。

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

if(x == 0.0) //隱含錯(cuò)誤的比較

轉(zhuǎn)化為

if((x >= -EPSINON) && (x <= EPSINON)) //其中EPSINON是允許的誤差(即精度)。

(4)指針變量與零值比較:應(yīng)當(dāng)將指針變量用“==”或“!=”與NULL比較。

指針變量的零值是“空”(記NULL)。盡管NULL的值與0相同,但二者的意義不同。假設(shè)指針變量名p,它與零值比較的標(biāo)準(zhǔn)if語句如下:

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

不要寫成:

if(p == 0) if(p != 0) //容易讓人誤解p是整型變量

或者

if(p) if(!p) //容易讓人誤解p是布爾變量

(5)對(duì)if語句的補(bǔ)充說明

有時(shí)候可能會(huì)看到if(NULL == p)這樣古怪的格式。這樣寫能夠防止將if(p == NULL)誤寫成if(p = NULL),而有意將p和NULL顛倒。編譯器認(rèn)為if(p = NULL)是合法的,但會(huì)指出if(NULL = p)是錯(cuò)誤的,因?yàn)镹ULL不能被賦值。程序中有時(shí)會(huì)遇到if/else/return的組合,應(yīng)該將如下不良風(fēng)格的程序:

if(condition) return x; return y;

改寫成

if(condition) { return x; } else { return y; }

或者改成更加簡(jiǎn)練的:

return(condition ?x:y);

循環(huán)語句的效率

C++/C循環(huán)語句中,for語句使用頻率最高,while語句其次,do語句很少用。提高循環(huán)體效率的基本方法是降低循環(huán)體的復(fù)雜性。

(1)在多重循環(huán)中,如果有可能,應(yīng)當(dāng)將最長(zhǎng)的循環(huán)放在最內(nèi)層,最短的循環(huán)放在最外層,以減少CPU跨切循環(huán)層的次數(shù)。例如下面代碼示例b的效率就比示例a的高。

示例a:低效率(長(zhǎng)循環(huán)在最外層)

for(row = 0; row < 100; row++) { for(col=0;col<5;col++) { sum = sum +a[row][col]; } }

示例b:高效率(長(zhǎng)循環(huán)在最內(nèi)層)

for(col = 0; col < 5; col++) { for(row=0;row<100;row++) { sum = sum +a[row][col]; } }

(2)如果循環(huán)體內(nèi)存在邏輯判斷,并且循環(huán)次數(shù)很大,宜將邏輯判斷移到循環(huán)體的外面。

示例c的程序比示例d多執(zhí)行了 N-1 次邏輯判斷。并且由于前者老要進(jìn)行邏輯判斷,打斷了循環(huán)“流水線”作業(yè),使得編譯器不能對(duì)循環(huán)進(jìn)行優(yōu)化處理,降低了效率。如果 N 非常大,最好采用示例 d的寫法,可以提高效率。如果 N 非常小,兩者效率差別并不明顯,采用示例 c的寫法比較好,因?yàn)槌绦蚋雍?jiǎn)潔。

示例c:效率低但程序簡(jiǎn)潔

for(i = 0; i < N; i++) { if(condition) DoSomthing(); else DoSomthing(); }

示例d:效率高但程序不簡(jiǎn)潔

if (condition) { for (i=0; i

(3)for語句的循環(huán)控制變量

不可以在for循環(huán)體內(nèi)修改循環(huán)變量,防止for循環(huán)失去控制。

建議for語句的循環(huán)控制變量的取值采用“半開半閉區(qū)間”寫法。

示例e中的x值屬于半開半閉區(qū)間“0=

示例e:循環(huán)變量屬于半開半閉區(qū)間

for(int x = 0;x < N; x++) { }

示例f:循環(huán)變量屬于閉區(qū)間

for(int x = 0;x <= N-1; x++) { }

switch語句switch是多分支選擇語句,而if語句只有兩個(gè)分支可供選擇。雖然可以用嵌套的if語句來實(shí)現(xiàn)多分支選擇,但那樣的程序冗長(zhǎng)難讀。switch 語句基本格式:

switch(variable) { case value1: break; case value2: break; default: break; }

每個(gè) case 語句的結(jié)尾不要忘了加 break,否則將導(dǎo)致多個(gè)分支重疊(除非有意使多個(gè)分支重疊)。不要忘記最后那個(gè) default 分支,即使程序真的不需要 default 處理,也應(yīng)該保留語句 default : break; 這樣做并非多此一舉,而是為了防止別人誤以為你忘了 default 處理。

goto語句

自從提倡結(jié)構(gòu)化設(shè)計(jì)以來,goto 就成了有爭(zhēng)議的語句。

由于 goto 語句可以靈活跳轉(zhuǎn),如果不加限制,它的確會(huì)破壞結(jié)構(gòu)化設(shè)計(jì)風(fēng)格。

goto 語句經(jīng)常帶來錯(cuò)誤或隱患。它可能跳過了某些對(duì)象的構(gòu)造、變量的初始化、重要的計(jì)算等語句,

例如:

goto state; String s1, s2; // 被 goto 跳過 int sum = 0; // 被 goto 跳過 state:

如果編譯器不能發(fā)覺此類錯(cuò)誤,每用一次 goto 語句都可能留下隱患。很多人建議廢除 C++/C 的 goto 語句,以絕后患。

但實(shí)事求是地說,錯(cuò)誤是程序員自己造成的,不是 goto 的過錯(cuò)。goto 語句至少有一處可顯神通,它能從多重循環(huán)體中一下子跳到外面,用不著寫很多次的 break 語句;例如:

{ { { goto error; } } } error:

就像樓房著火了,來不及從樓梯一級(jí)一級(jí)往下走,可從窗口跳出火坑,所以我們主張少用、慎用 goto 語句,而不是禁用。

小結(jié)

主要針對(duì)if、for、while、goto、switch等基本語句使用時(shí)可能出現(xiàn)隱患問題,歸納了正確使用它們的一些規(guī)則和建議。

聲明:本文內(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)投訴
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7613

    瀏覽量

    137247
  • 編程
    +關(guān)注

    關(guān)注

    88

    文章

    3633

    瀏覽量

    93853
  • 變量
    +關(guān)注

    關(guān)注

    0

    文章

    613

    瀏覽量

    28425

原文標(biāo)題:C語言/C++基本語句編程風(fēng)格

文章出處:【微信號(hào):mcu168,微信公眾號(hào):硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    AKI跨語言調(diào)用庫神助攻C/C++代碼遷移至HarmonyOS NEXT

    )開發(fā)框架。它極大地簡(jiǎn)化了JS與C/C++之間的跨語言訪問,為開發(fā)者提供了一種邊界性編程體驗(yàn)友好的解決方案。通過AKI,開發(fā)者可以使用讓代碼更易讀的語法糖,實(shí)現(xiàn)JS與
    發(fā)表于 01-02 17:08

    深入理解C語言:循環(huán)語句的應(yīng)用與優(yōu)化技巧

    在程序設(shè)計(jì)中,我們常常需要重復(fù)執(zhí)行某一段代碼。為了提高效率和簡(jiǎn)化代碼,循環(huán)語句應(yīng)運(yùn)而生。C語言作為一門經(jīng)典的編程語言,提供了多種循環(huán)控制結(jié)構(gòu)
    的頭像 發(fā)表于 12-07 01:11 ?210次閱讀
    深入理解<b class='flag-5'>C</b><b class='flag-5'>語言</b>:循環(huán)<b class='flag-5'>語句</b>的應(yīng)用與優(yōu)化技巧

    NPU支持的編程語言有哪些

    與NPU一起使用: C/C++CC++是性能要求較高的應(yīng)用的首選語言,尤其是在需要直接與硬件交互的場(chǎng)景中。許多NPU硬件都提供了
    的頭像 發(fā)表于 11-15 09:21 ?802次閱讀

    技術(shù)干貨驛站 ▏深入理解C語言:掌握C語言條件判斷,從if到switch的應(yīng)用

    編程中,條件判斷語句是控制程序流程的核心元素之一。它們使得程序能夠根據(jù)不同的輸入和狀態(tài),做出相應(yīng)的決策。特別是在C語言中,條件判斷語句的使
    的頭像 發(fā)表于 11-09 01:10 ?394次閱讀
    技術(shù)干貨驛站 ▏深入理解<b class='flag-5'>C</b><b class='flag-5'>語言</b>:掌握<b class='flag-5'>C</b><b class='flag-5'>語言</b>條件判斷,從if到switch的應(yīng)用

    C語言中的socket編程基礎(chǔ)

    Socket編程簡(jiǎn)介 Socket是一種通信機(jī)制,允許程序之間進(jìn)行通信。在C語言中,socket編程是網(wǎng)絡(luò)編程的基礎(chǔ)。通過使用socket,
    的頭像 發(fā)表于 11-01 16:51 ?386次閱讀

    C語言C++中結(jié)構(gòu)體的區(qū)別

    同樣是結(jié)構(gòu)體,看看在C語言C++中有什么區(qū)別?
    的頭像 發(fā)表于 10-30 15:11 ?301次閱讀

    Orin芯片的編程語言支持

    語言支持 Orin芯片支持多種編程語言,以滿足不同開發(fā)者的需求。其中,C/C++和Python是兩種廣泛應(yīng)用的
    的頭像 發(fā)表于 10-27 16:45 ?357次閱讀

    C++語言基礎(chǔ)知識(shí)

    電子發(fā)燒友網(wǎng)站提供《C++語言基礎(chǔ)知識(shí).pdf》資料免費(fèi)下載
    發(fā)表于 07-19 10:58 ?7次下載

    PLC編程語言C語言的區(qū)別

    在工業(yè)自動(dòng)化和計(jì)算機(jī)編程領(lǐng)域中,PLC(可編程邏輯控制器)編程語言C語言各自扮演著重要的角色。
    的頭像 發(fā)表于 06-14 17:11 ?3052次閱讀

    為什么很少用C++開發(fā)單片機(jī)

    C語言是面向過程的語言,C++是面向?qū)ο蟮?b class='flag-5'>編程語言。結(jié)合本文來說,面向過程相比面向?qū)ο蟮?/div>
    發(fā)表于 03-25 14:26 ?1077次閱讀
    為什么很少用<b class='flag-5'>C++</b>開發(fā)單片機(jī)

    C語言#define的應(yīng)用

    C/C++ 編程語言中,當(dāng)程序被編譯時(shí),被發(fā)送到編譯器,編譯器將程序轉(zhuǎn)換為機(jī)器語言,然后完成編譯并執(zhí)行該程序。預(yù)處理器也稱為宏預(yù)處理器。
    發(fā)表于 03-06 11:29 ?393次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>#define的應(yīng)用

    plc編程語言c語言的聯(lián)系 c語言和PLC有什么區(qū)別

    語言,主要用于開發(fā)各種應(yīng)用程序。盡管PLC編程語言C語言有一些相似之處,但它們之間也存在一些明顯的區(qū)別。 首先,PLC
    的頭像 發(fā)表于 02-05 14:21 ?4277次閱讀

    c語言,c++,java,python區(qū)別

    C語言、C++、Java和Python是四種常見的編程語言,各有優(yōu)點(diǎn)和特點(diǎn)。 C
    的頭像 發(fā)表于 02-05 14:11 ?2505次閱讀

    vb語言c++語言的區(qū)別

    VB語言C++語言是兩種不同的編程語言,雖然它們都屬于高級(jí)編程
    的頭像 發(fā)表于 02-01 10:20 ?2414次閱讀

    深入探討嵌入式C編程的goto語句

    什么是goto語句? goto 語句被稱為 C 語言中的跳轉(zhuǎn)語句。 用于無條件跳轉(zhuǎn)到其他標(biāo)簽。它將控制權(quán)轉(zhuǎn)移到程序的其他部分。
    發(fā)表于 01-21 10:41 ?628次閱讀
    深入探討嵌入式<b class='flag-5'>C</b><b class='flag-5'>編程</b>的goto<b class='flag-5'>語句</b>