RM新时代网站-首页

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

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

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

基本語句編程的一些規(guī)則和建議

GReq_mcu168 ? 來源:C語言與CPP編程 ? 作者:自成一派123 ? 2022-04-27 12:53 ? 次閱讀

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

基本語句編程舉例

  • if語句

if語句是C++/C語言中最簡單、最常用的語句,然而很多編程人員用隱含錯誤的方式寫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) //會讓人誤解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) //隱含錯誤的比較

轉(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)對if語句的補(bǔ)充說明

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


	

if(condition) return x; return y;

改寫成


	

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

或者改成更加簡練的:


	

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)將最長的循環(huán)放在最內(nèi)層,最短的循環(huán)放在最外層,以減少CPU跨切循環(huán)層的次數(shù)。例如下面代碼示例b的效率就比示例a的高。

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


	

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

示例b:高效率(長循環(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è),使得編譯器不能對循環(huán)進(jìn)行優(yōu)化處理,降低了效率。如果 N 非常大,最好采用示例 d的寫法,可以提高效率。如果 N 非常小,兩者效率差別并不明顯,采用示例 c的寫法比較好,因?yàn)槌绦蚋雍啙崱?/p>

示例c:效率低但程序簡潔


	

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

示例d:效率高但程序不簡潔


	

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語句只有兩個分支可供選擇。雖然可以用嵌套的if語句來實(shí)現(xiàn)多分支選擇,但那樣的程序冗長難讀。switch 語句基本格式:


	

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

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

  • goto語句

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

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

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

例如:


	

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

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

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


	

{ { { goto error; } } } error:

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

小結(jié)

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

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

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

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

    關(guān)注

    180

    文章

    7604

    瀏覽量

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

    關(guān)注

    88

    文章

    3614

    瀏覽量

    93686
  • 基本語句
    +關(guān)注

    關(guān)注

    0

    文章

    4

    瀏覽量

    1030

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

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

收藏 人收藏

    評論

    相關(guān)推薦

    PCB布線需要遵循的一些基本規(guī)則

    布線是PCB設(shè)計(jì)的重要組成部分,也是整個PCB設(shè)計(jì)中工作量最大和最耗時(shí)間的部分,工程師在進(jìn)行PCB布線工作時(shí),需要遵循一些基本的規(guī)則,如倒角規(guī)則、3W規(guī)則等。
    發(fā)表于 10-31 14:30 ?1633次閱讀

    關(guān)于編程一些問題

    開始學(xué)習(xí)編程的時(shí)候沒想那么多,可是現(xiàn)在編的程序大了之后開始考慮一些算法的東西 因?yàn)?b class='flag-5'>編程的時(shí)候都是在大腦里想的邏輯順序 然后就直接編程 可是隨著程序代碼量大了之后,自己越來越困難了
    發(fā)表于 10-30 20:59

    關(guān)于編程一些問題?

    本人對編程來說,是個小白的,請問下,我怎么能夠快速成長成為編程高手,能夠自己寫代碼的?有誰能提供一些忠實(shí)的意見的嗎?謝謝,還請過來人能夠多多談?wù)劦模x謝,經(jīng)驗(yàn)分享下,不勝感激,是不
    發(fā)表于 06-03 22:35

    講解Matlab的一些編程語句

    第5章 Matlab簡易使用之常用編程語句本期教程主要是講解Matlab的一些編程語句。目錄第5章 Matlab簡易使用之常用
    發(fā)表于 08-17 07:45

    關(guān)于電源線的一些規(guī)則

    **關(guān)于過孔的大?。弘娫催€沒學(xué)完,待續(xù)。。。。關(guān)于電源線的一些規(guī)則:待續(xù)本章的一些零碎總結(jié):1.不改變規(guī)則前提下消除錯誤綠色提示T+M2.電源布線盡量寬
    發(fā)表于 11-11 07:09

    講解Matlab的一些編程語句

    Matlab常用的編程語句有哪些呢?怎樣去使用這些編程語句呢?
    發(fā)表于 11-18 07:30

    介紹一些常見的匯編語句

    即使使用C/C++或者其他高級語言編程,最后也會被編譯工具轉(zhuǎn)換為匯編代碼,并最終作為機(jī)器碼存儲在內(nèi)存、硬盤或者其他存儲器上。在調(diào)試程序時(shí),經(jīng)常需要閱讀它的匯編代碼.這里介紹一些自己常見的匯編語句
    發(fā)表于 12-20 06:05

    PCB布板一些簡易常用規(guī)則

    PCB布板一些簡易常用規(guī)則   這幾天還是關(guān)注一些簡單入門的東西吧,主要介紹一些PCB中一些
    發(fā)表于 11-21 14:34 ?6629次閱讀

    如何使用PU學(xué)習(xí)進(jìn)行建議語句分類的方法說明

    建議挖掘作為項(xiàng)新興研究任務(wù),具有重要的應(yīng)用價(jià)值。針對傳統(tǒng)建議語句分類方法所存在的規(guī)則復(fù)雜、標(biāo)注工作量大、特征維度高、數(shù)據(jù)稀疏等問題,提出
    發(fā)表于 03-27 11:26 ?4次下載
    如何使用PU學(xué)習(xí)進(jìn)行<b class='flag-5'>建議</b><b class='flag-5'>語句</b>分類的方法說明

    關(guān)于學(xué)習(xí)Linux的一些建議

    不管是在生活還是工作中,每個人都會逐漸養(yǎng)成一些小習(xí)慣。壞習(xí)慣旦形成就很難改正,所在在系統(tǒng)學(xué)習(xí) Linux 之前,給大家一些建議,刻意去培養(yǎng)一些
    發(fā)表于 07-14 14:22 ?597次閱讀

    了解一些C程序的基本規(guī)則

    程序由個或多個函數(shù)組成,其中定有個名為 main()的函數(shù)。函數(shù)的描述由函數(shù)頭和函數(shù)體組成。函數(shù)頭包括預(yù)處理語句#include和函數(shù)名??梢酝ㄟ^圓括號識別
    的頭像 發(fā)表于 07-27 11:01 ?2510次閱讀
    了解<b class='flag-5'>一些</b>C程序的基本<b class='flag-5'>規(guī)則</b>

    APT觸摸布局的一些建議詳細(xì)說明

    本文檔的主要內(nèi)容詳細(xì)介紹的是APT觸摸布局的一些建議詳細(xì)說明。
    發(fā)表于 10-27 08:00 ?0次下載
    APT觸摸布局的<b class='flag-5'>一些</b><b class='flag-5'>建議</b>詳細(xì)說明

    一些與眾不同的PCB布線經(jīng)驗(yàn)規(guī)則

    PCB設(shè)計(jì)論壇中的 遵守/避免布線法則,使得PCB設(shè)計(jì)者在這些規(guī)則也許不適用的地方要么遵守,要么忽略他們。一些情況下,這未必造成電路板設(shè)
    的頭像 發(fā)表于 11-01 10:33 ?3109次閱讀

    學(xué)習(xí)linux內(nèi)核的一些建議

    學(xué)習(xí)linux內(nèi)核,這個可不像學(xué)門語言,c或者java個月或者3月你就能精通掌握。學(xué)習(xí)linux內(nèi)核是需要步循序漸進(jìn),掌握正確的linux內(nèi)核學(xué)習(xí)路線對學(xué)習(xí)至關(guān)重要,本篇文章
    發(fā)表于 05-07 15:20 ?618次閱讀
    學(xué)習(xí)linux內(nèi)核的<b class='flag-5'>一些</b><b class='flag-5'>建議</b>

    針對RF PCBA設(shè)計(jì)的一些建議

    射頻(RF)PCBA設(shè)計(jì)涉及系列復(fù)雜的考慮因素,包括天線設(shè)計(jì)、濾波器設(shè)計(jì)以及傳輸線(RF Trace)的優(yōu)化。這些因素對于無線通信和射頻應(yīng)用的性能至關(guān)重要。以下是針對RF PCBA設(shè)計(jì)的一些建議。
    的頭像 發(fā)表于 10-30 10:19 ?483次閱讀
    RM新时代网站-首页