=”或“<=”形式。" />

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

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

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

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

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

GReq_mcu168 ? 來(lái)源:玩轉(zhuǎn)單片機(jī) ? 2020-08-05 11:03 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

基本語(yǔ)句編程舉例

if語(yǔ)句

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

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

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

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

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語(yǔ)句如下:

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

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

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

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

千萬(wàn)留意,無(wú)論是float還是double類(lèi)型的變量,都有精度限制,所以一定要避免將浮點(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語(yǔ)句如下:

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

不要寫(xiě)成:

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

或者

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

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

有時(shí)候可能會(huì)看到if(NULL == p)這樣古怪的格式。這樣寫(xiě)能夠防止將if(p == NULL)誤寫(xiě)成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;

改寫(xiě)成

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

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

return(condition ?x:y);

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

C++/C循環(huán)語(yǔ)句中,for語(yǔ)句使用頻率最高,while語(yǔ)句其次,do語(yǔ)句很少用。提高循環(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的寫(xiě)法,可以提高效率。如果 N 非常小,兩者效率差別并不明顯,采用示例 c的寫(xiě)法比較好,因?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語(yǔ)句的循環(huán)控制變量

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

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

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

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

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

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

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

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

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

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

goto語(yǔ)句

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

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

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

例如:

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

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

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

{ { { goto error; } } } error:

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

小結(jié)

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

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

    關(guān)注

    183

    文章

    7645

    瀏覽量

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

    關(guān)注

    90

    文章

    3717

    瀏覽量

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

    關(guān)注

    0

    文章

    616

    瀏覽量

    29532

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

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    汽車(chē)網(wǎng)絡(luò)安全開(kāi)發(fā)語(yǔ)言選型指南:C/C++/Rust/Java等主流語(yǔ)言對(duì)比+Perforce QAC/Klocwork工具支持

    汽車(chē)網(wǎng)絡(luò)安全如何選編程語(yǔ)言?CC++、Rust、Java……誰(shuí)更適合AUTOSAR、ISO/SAE 21434?一文了解8種主流語(yǔ)言的優(yōu)劣
    的頭像 發(fā)表于 12-26 11:13 ?475次閱讀
    汽車(chē)網(wǎng)絡(luò)安全開(kāi)發(fā)<b class='flag-5'>語(yǔ)言</b>選型指南:<b class='flag-5'>C</b>/<b class='flag-5'>C++</b>/Rust/Java等主流<b class='flag-5'>語(yǔ)言</b>對(duì)比+Perforce QAC/Klocwork工具支持

    C語(yǔ)言C++的區(qū)別及聯(lián)系

    C語(yǔ)言C++到底是什么關(guān)系? 首先C++C語(yǔ)言本來(lái)就是兩種不同的
    發(fā)表于 12-24 07:23

    CC++之間的聯(lián)系

    控制能力,這一點(diǎn)與C語(yǔ)言相似,使得它們?cè)谙到y(tǒng)編程、嵌入式系統(tǒng)等領(lǐng)域都得到廣泛應(yīng)用。 3、發(fā)展歷程: C++正是在C
    發(fā)表于 12-11 06:51

    C語(yǔ)言C++之間的區(qū)別是什么

    區(qū)別 1、面向?qū)ο?b class='flag-5'>編程 (OOP): C語(yǔ)言是一種面向過(guò)程的語(yǔ)言,它強(qiáng)調(diào)的是通過(guò)函數(shù)將任務(wù)分解為一系列步驟進(jìn)行執(zhí)行。 C++
    發(fā)表于 12-11 06:23

    如何調(diào)試和編程CW32F030C8T7?支持哪些調(diào)試工具和編程語(yǔ)言?

    了解如何調(diào)試和編程CW32F030C8T7是開(kāi)發(fā)過(guò)程中的重要環(huán)節(jié)。它支持哪些調(diào)試工具(如JTAG、串口調(diào)試等)和編程語(yǔ)言(如C
    發(fā)表于 12-05 06:48

    C語(yǔ)言編程技巧

    設(shè)計(jì),分層開(kāi)發(fā)代碼,便于理解和維護(hù)。 ?8、避免使用GOTO語(yǔ)句?:盡管GOTO語(yǔ)句在某些情況下仍然有用,但現(xiàn)代編程更傾向于使用函數(shù)和循環(huán)控制結(jié)構(gòu),以提高代碼的可讀性和維護(hù)性。 ?9、利用C
    發(fā)表于 11-27 06:46

    C語(yǔ)言和單片機(jī)C語(yǔ)言有什么差異

    區(qū)別是由編譯器決的,只能參考對(duì)應(yīng)的編譯手冊(cè),即使同種平臺(tái)不同的編譯器對(duì)C的擴(kuò)展也有不同。 3、單片機(jī)c語(yǔ)言編程是基于C
    發(fā)表于 11-14 07:55

    第4章 C語(yǔ)言基礎(chǔ)以及流水燈的實(shí)現(xiàn)(4.5 4.6)

    4.5while循環(huán)語(yǔ)句 在單片機(jī)C語(yǔ)言編程的時(shí)候,每個(gè)程序都會(huì)固定的加一句while(1),這條語(yǔ)句就可以起到死循環(huán)的作用。對(duì)于while
    的頭像 發(fā)表于 11-06 11:21 ?402次閱讀

    技能+1!如何在樹(shù)莓派上使用C++控制GPIO?

    在使用樹(shù)莓派時(shí),你會(huì)發(fā)現(xiàn)Python和Scratch是許多任務(wù)(包括GPIO編程)中最常用的編程語(yǔ)言。但你知道嗎,你也可以使用C++進(jìn)行GPIO編程
    的頭像 發(fā)表于 08-06 15:33 ?4255次閱讀
    技能+1!如何在樹(shù)莓派上使用<b class='flag-5'>C++</b>控制GPIO?

    C++ 與 Python:樹(shù)莓派上哪種語(yǔ)言更優(yōu)?

    Python是樹(shù)莓派上的首選編程語(yǔ)言,我們的大部分教程都使用它。然而,C++在物聯(lián)網(wǎng)項(xiàng)目中同樣廣受歡迎且功能強(qiáng)大。那么,在樹(shù)莓派項(xiàng)目中選擇哪種語(yǔ)言更合適呢?Python因其簡(jiǎn)潔性、豐富
    的頭像 發(fā)表于 07-24 15:32 ?986次閱讀
    <b class='flag-5'>C++</b> 與 Python:樹(shù)莓派上哪種<b class='flag-5'>語(yǔ)言</b>更優(yōu)?

    《ESP32S3 Arduino開(kāi)發(fā)指南》第三章 C/C++語(yǔ)言基礎(chǔ)

    第三章 C/C++語(yǔ)言基礎(chǔ) C/C++語(yǔ)言是國(guó)際上廣泛流行的計(jì)算機(jī)高級(jí)
    發(fā)表于 06-10 09:20

    詳解TIA Portal SCL編程語(yǔ)言中的IF語(yǔ)句

    IF 語(yǔ)句編程中最基本和最重要的控制結(jié)構(gòu)之一,它的主要作用是根據(jù)條件決定程序的執(zhí)行路徑,IF 語(yǔ)句編程中實(shí)現(xiàn)邏輯判斷和決策的基礎(chǔ)。
    的頭像 發(fā)表于 05-24 15:01 ?1953次閱讀
    詳解TIA Portal SCL<b class='flag-5'>編程</b><b class='flag-5'>語(yǔ)言</b>中的IF<b class='flag-5'>語(yǔ)句</b>

    主流的 MCU 開(kāi)發(fā)語(yǔ)言為什么是 C 而不是 C++

    在單片機(jī)的地界兒里,C語(yǔ)言穩(wěn)坐中軍帳,C++想分杯羹?難嘍。咱電子工程師天天跟那針尖大的內(nèi)存空間較勁,C++那些花里胡哨的玩意兒,在這兒真玩不轉(zhuǎn)。先說(shuō)內(nèi)存這道坎兒。您當(dāng)stm32f4的
    的頭像 發(fā)表于 05-21 10:33 ?1076次閱讀
    主流的 MCU 開(kāi)發(fā)<b class='flag-5'>語(yǔ)言</b>為什么是 <b class='flag-5'>C</b> 而不是 <b class='flag-5'>C++</b>?

    單片機(jī)c語(yǔ)言編程實(shí)例大全

    單片機(jī)c語(yǔ)言編程實(shí)例大全_18
    發(fā)表于 04-30 16:11 ?7次下載

    深入理解C語(yǔ)言C語(yǔ)言循環(huán)控制

    C語(yǔ)言編程中,循環(huán)結(jié)構(gòu)是至關(guān)重要的,它可以讓程序重復(fù)執(zhí)行特定的代碼塊,從而提高編程效率。然而,為了避免程序進(jìn)入無(wú)限循環(huán),C
    的頭像 發(fā)表于 04-29 18:49 ?2098次閱讀
    深入理解<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>:<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>循環(huán)控制