衡阳派盒市场营销有限公司

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

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

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

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

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

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

基本語句編程舉例

  • if語句

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

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

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

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


	

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

其他的用法都屬于不良風格,例如:


	

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

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


	

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

不可以模仿布爾變量的風格而寫成:


	

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

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

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


	

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

轉(zhuǎn)化為


	

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

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

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


	

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

不要寫成:


	

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

或者


	

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

(5)對if語句的補充說明

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


	

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)體的復雜性。

(1)在多重循環(huán)中,如果有可能,應當將最長的循環(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 次邏輯判斷。并且由于前者老要進行邏輯判斷,打斷了循環(huán)“流水線”作業(yè),使得編譯器不能對循環(huán)進行優(yōu)化處理,降低了效率。如果 N 非常大,最好采用示例 d的寫法,可以提高效率。如果 N 非常小,兩者效率差別并不明顯,采用示例 c的寫法比較好,因為程序更加簡潔。

示例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語句來實現(xiàn)多分支選擇,但那樣的程序冗長難讀。switch 語句基本格式:


	

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

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

  • goto語句

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

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

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

例如:


	

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

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

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


	

{ { { goto error; } } } error:

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

小結(jié)

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

原文標題:C語言/C++基本語句編程風格

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

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

    關(guān)注

    180

    文章

    7614

    瀏覽量

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

    關(guān)注

    88

    文章

    3637

    瀏覽量

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

    關(guān)注

    0

    文章

    4

    瀏覽量

    1043

原文標題:C語言/C++基本語句編程風格

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

收藏 人收藏

    評論

    相關(guān)推薦

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

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

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

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

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

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

    講解Matlab的一些編程語句

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

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

    **關(guān)于過孔的大小:電源還沒學完,待續(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)換為匯編代碼,并最終作為機器碼存儲在內(nèi)存、硬盤或者其他存儲器上。在調(diào)試程序時,經(jīng)常需要閱讀它的匯編代碼.這里介紹一些自己常見的匯編語句
    發(fā)表于 12-20 06:05

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

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

    如何使用PU學習進行建議語句分類的方法說明

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

    關(guān)于學習Linux的一些建議

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

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

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

    APT觸摸布局的一些建議詳細說明

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

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

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

    學習linux內(nèi)核的一些建議

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

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

    射頻(RF)PCBA設(shè)計涉及系列復雜的考慮因素,包括天線設(shè)計、濾波器設(shè)計以及傳輸線(RF Trace)的優(yōu)化。這些因素對于無線通信和射頻應用的性能至關(guān)重要。以下是針對RF PCBA設(shè)計的一些建議
    的頭像 發(fā)表于 10-30 10:19 ?551次閱讀
    佛山市| 大发888官网注册送58| 百家乐筹码防伪| YY百家乐的玩法技巧和规则| 大发888国际娱乐bet| 娱乐场| 百家乐官网筹码样式| 百家乐官网游戏机图片| 太子百家乐官网的玩法技巧和规则| 澳门百家乐投注法| 怎样玩百家乐的玩法技巧和规则| 大发888舍出同线牌| 名山县| 百家乐官网赌博游戏平台| 在百家乐官网二庄两闲揽的概率 | 百家乐游戏研发| 博发百家乐的玩法技巧和规则| 三晋棋牌中心| 百家乐官网巴厘岛娱乐城| 百家乐官网大西洋| 百家乐平台哪个比较安全| 大发888手机| 百家乐官网真钱牌九| 赌王百家乐官网的玩法技巧和规则 | 娱乐城送18| 现场百家乐官网牌路分析| 玩百家乐澳门368娱乐城| 大发888大发888娱乐游戏| 百家乐官网太阳城怎么样| 爱赢百家乐官网的玩法技巧和规则| 杭州百家乐西园| 姚安县| 风水24山对应的字为吉| 大发888线上娱乐城| 太阳城百家乐官网客户端| 百家乐游戏玩法规则| 顶级赌场官方客户端下载| 百家乐官网真人娱乐城陈小春| 百家乐投注平台信誉排行| 博发娱乐| 百家乐官网官网网址|