青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

  C++博客 :: 首頁(yè) :: 聯(lián)系 ::  :: 管理
  163 Posts :: 4 Stories :: 350 Comments :: 0 Trackbacks

常用鏈接

留言簿(48)

我參與的團(tuán)隊(duì)

搜索

  •  

積分與排名

  • 積分 - 401640
  • 排名 - 59

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

4 表達(dá)式和基本語(yǔ)句

讀者可能懷疑:連iffor、while、gotoswitch這樣簡(jiǎn)單的東西也要探討編程風(fēng)格,是不是小題大做?

我真的發(fā)覺(jué)很多程序員用隱含錯(cuò)誤的方式寫(xiě)表達(dá)式和基本語(yǔ)句,我自己也犯過(guò)類(lèi)似的錯(cuò)誤。

表達(dá)式和語(yǔ)句都屬于C++/C的短語(yǔ)結(jié)構(gòu)語(yǔ)法。它們看似簡(jiǎn)單,但使用時(shí)隱患比較多。本章歸納了正確使用表達(dá)式和語(yǔ)句的一些規(guī)則與建議。

4.1 運(yùn)算符的優(yōu)先級(jí)

       C++/C語(yǔ)言的運(yùn)算符有數(shù)十個(gè),運(yùn)算符的優(yōu)先級(jí)與結(jié)合律如表4-1所示。注意一元運(yùn)算符 +  -  * 的優(yōu)先級(jí)高于對(duì)應(yīng)的二元運(yùn)算符。

 

優(yōu)先級(jí)

運(yùn)算符

結(jié)合律

 

 

 

 

 

 

 

( )  [ ]  ->  .

從左至右

!  ~  ++  --  (類(lèi)型) sizeof

+  -  *  &

從右至左

 

*  /  %

從左至右

+  -

從左至右

<<  >>

從左至右

<   <=   >  >=

從左至右

==  !=

從左至右

&

從左至右

^

從左至右

|

從左至右

&&

從左至右

||

從右至左

?:

從右至左

=  +=  -=  *=  /=  %=  &=  ^=

|=  <<=  >>=

從左至右

4-1 運(yùn)算符的優(yōu)先級(jí)與結(jié)合律

 

l         【規(guī)則4-1-1】如果代碼行中的運(yùn)算符比較多,用括號(hào)確定表達(dá)式的操作順序,避免使用默認(rèn)的優(yōu)先級(jí)。

由于將表4-1熟記是比較困難的,為了防止產(chǎn)生歧義并提高可讀性,應(yīng)當(dāng)用括號(hào)確定表達(dá)式的操作順序。例如:

word = (high << 8) | low

if ((a | b) && (a & c))  

4.2 復(fù)合表達(dá)式

a = b = c = 0這樣的表達(dá)式稱(chēng)為復(fù)合表達(dá)式。允許復(fù)合表達(dá)式存在的理由是:(1)書(shū)寫(xiě)簡(jiǎn)潔;(2)可以提高編譯效率。但要防止濫用復(fù)合表達(dá)式。

 

l         【規(guī)則4-2-1不要編寫(xiě)太復(fù)雜的復(fù)合表達(dá)式。

例如:

      i = a >= b && c < d && c + f <= g + h ; // 復(fù)合表達(dá)式過(guò)于復(fù)雜

 

l         【規(guī)則4-2-2不要有多用途的復(fù)合表達(dá)式。

例如:

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

該表達(dá)式既求a值又求d值。應(yīng)該拆分為兩個(gè)獨(dú)立的語(yǔ)句:

a = b + c;

d = a + r;

 

l         【規(guī)則4-2-3不要把程序中的復(fù)合表達(dá)式與“真正的數(shù)學(xué)表達(dá)式”混淆。

例如: 

if (a < b < c)          // a < b < c數(shù)學(xué)表達(dá)式而不是程序表達(dá)式

并不表示      

if ((a<b) && (b<c))

而是成了令人費(fèi)解的

if ( (a<b)<c )

4.3 if 語(yǔ)句

    if語(yǔ)句是C++/C語(yǔ)言中最簡(jiǎn)單、最常用的語(yǔ)句,然而很多程序員用隱含錯(cuò)誤的方式寫(xiě)if語(yǔ)句。本節(jié)以“與零值比較”為例,展開(kāi)討論。

 

4.3.1 布爾變量與零值比較

l         【規(guī)則4-3-1不可將布爾變量直接與TRUE、FALSE或者1、0進(jìn)行比較。

根據(jù)布爾類(lèi)型的語(yǔ)義,零值為“假”(記為FALSE),任何非零值都是“真”(記為TRUE)。TRUE的值究竟是什么并沒(méi)有統(tǒng)一的標(biāo)準(zhǔn)。例如Visual C++ TRUE定義為1,而Visual Basic則將TRUE定義為-1

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

if (flag)   // 表示flag為真

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

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

    if (flag == TRUE)  

    if (flag == 1 )    

    if (flag == FALSE)  

    if (flag == 0)     

 

4.3.2 整型變量與零值比較

l         【規(guī)則4-3-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)      // 會(huì)讓人誤解 value是布爾變量

if (!value)

 

4.3.3 浮點(diǎn)變量與零值比較

l         【規(guī)則4-3-3不可將浮點(diǎn)變量用“==”或“!=”與任何數(shù)字比較。

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

    假設(shè)浮點(diǎn)變量的名字為x,應(yīng)當(dāng)將  

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

轉(zhuǎn)化為

if ((x>=-EPSINON) && (x<=EPSINON))

其中EPSINON是允許的誤差(即精度)。

 

4.3.4 指針變量與零值比較

l         【規(guī)則4-3-4應(yīng)當(dāng)將指針變量用“==”或“!=”與NULL比較。

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

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

        if (p != NULL) 

不要寫(xiě)成

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

        if (p != 0)    

    或者

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

    if (!p)        

 

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

有時(shí)候我們可能會(huì)看到 if (NULL == p) 這樣古怪的格式。不是程序?qū)戝e(cuò)了,是程序員為了防止將 if (p == NULL) 誤寫(xiě)成 if (p = NULL),而有意把pNULL顛倒。編譯器認(rèn)為 if (p = NULL) 是合法的,但是會(huì)指出 if (NULL = p)是錯(cuò)誤的,因?yàn)?span lang="EN-US">NULL不能被賦值。

程序中有時(shí)會(huì)遇到if/else/return的組合,應(yīng)該將如下不良風(fēng)格的程序

    if (condition) 

        return x;

    return y;

改寫(xiě)為

    if (condition)

    {

        return x;

    }

    else

    {

return y;

}

或者改寫(xiě)成更加簡(jiǎn)練的

return (condition ? x : y);

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

    C++/C循環(huán)語(yǔ)句中,for語(yǔ)句使用頻率最高,while語(yǔ)句其次,do語(yǔ)句很少用。本節(jié)重點(diǎn)論述循環(huán)體的效率。提高循環(huán)體效率的基本辦法是降低循環(huán)體的復(fù)雜性。

 

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

 

for (row=0; row<100; row++)

{

for ( col=0; col<5; col++ )

{

sum = sum + a[row][col];

}

}

for (col=0; col<5; col++ )

{

for (row=0; row<100; row++)

{

    sum = sum + a[row][col];

}

}

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

 

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

 

for (i=0; i<N; i++)

{

if (condition)

    DoSomething();

else

    DoOtherthing();

}

if (condition)

{

for (i=0; i<N; i++)

    DoSomething();

}

else

{

    for (i=0; i<N; i++)

    DoOtherthing();

}

4-4(c) 效率低但程序簡(jiǎn)潔                4-4(d) 效率高但程序不簡(jiǎn)潔

4.5 for 語(yǔ)句的循環(huán)控制變量

l         【規(guī)則4-5-1不可在for 循環(huán)體內(nèi)修改循環(huán)變量,防止for 循環(huán)失去控制。

 

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

示例4-5(a)中的x值屬于半開(kāi)半閉區(qū)間“0 =< x < N”,起點(diǎn)到終點(diǎn)的間隔為N,循環(huán)次數(shù)為N。

示例4-5(b)中的x值屬于閉區(qū)間“0 =< x <= N-1”,起點(diǎn)到終點(diǎn)的間隔為N-1,循環(huán)次數(shù)為N。

相比之下,示例4-5(a)的寫(xiě)法更加直觀,盡管兩者的功能是相同的。

 

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

{

}

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

{

}

示例4-5(a) 循環(huán)變量屬于半開(kāi)半閉區(qū)間           示例4-5(b) 循環(huán)變量屬于閉區(qū)間

4.6 switch語(yǔ)句

    有了if語(yǔ)句為什么還要switch語(yǔ)句?

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

    switch語(yǔ)句的基本格式是:

switch (variable)

{

case value1 :  

break;

case value2 :  

break;

   

default : 

break;

}

 

l         【規(guī)則4-6-1每個(gè)case語(yǔ)句的結(jié)尾不要忘了加break,否則將導(dǎo)致多個(gè)分支重疊(除非有意使多個(gè)分支重疊)。

l         【規(guī)則4-6-2不要忘記最后那個(gè)default分支。即使程序真的不需要default處理,也應(yīng)該保留語(yǔ)句   default : break; 這樣做并非多此一舉,而是為了防止別人誤以為你忘了default處理。

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

  { …

      { …

          { …

              goto error;

          }

      }

  }

  error:

 

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

 

posted on 2007-12-15 08:39 sdfasdf 閱讀(245) 評(píng)論(1)  編輯 收藏 引用 所屬分類(lèi): C++

Feedback

# re: 高質(zhì)量C++/C 編程指南第四章(林銳博士經(jīng)典,與大家共同學(xué)習(xí)) 2007-12-20 21:40 月朗
太多了  回復(fù)  更多評(píng)論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲一区二区三区在线视频| 最新成人av网站| 中文av字幕一区| 亚洲第一狼人社区| 久久久噜噜噜久久人人看| 国内精品国产成人| 蜜桃伊人久久| 美女视频一区免费观看| 最新日韩av| 中文av字幕一区| 国产精品欧美日韩一区| 欧美一区91| 国精产品99永久一区一区| 曰韩精品一区二区| 亚洲影视在线| 午夜精品久久久久久久久久久久久| 亚洲啪啪91| 久久亚洲综合网| 久久九九国产| 韩日成人在线| 久久精品女人的天堂av| 久久精品一区二区三区中文字幕 | 一级成人国产| 欧美激情偷拍| 欧美激情精品久久久久久蜜臀 | 99国内精品久久| 亚洲美女av网站| 夜夜嗨一区二区| 黄色欧美成人| 亚洲精品网站在线播放gif| 国产欧美日韩在线视频| 亚洲激情av| 国产精品私人影院| 欧美日本乱大交xxxxx| 国产精品久久久久久久久久三级| 久久精品二区三区| 免费永久网站黄欧美| 亚洲主播在线观看| 欧美ed2k| 久久国产精品久久国产精品| 免费观看成人| 久久久伊人欧美| 欧美日韩福利在线观看| 美国十次了思思久久精品导航| 欧美日本亚洲| 欧美va天堂| 国产亚洲精品高潮| 亚洲欧美日韩国产| 亚洲天堂偷拍| 欧美日韩国产成人在线免费| 欧美freesex交免费视频| 国产婷婷一区二区| 亚洲女人小视频在线观看| 亚洲视频一区二区| 欧美承认网站| 亚洲大胆av| 亚洲电影激情视频网站| 久久久伊人欧美| 久热精品视频在线| 国产一区二区三区在线播放免费观看 | 久久亚洲捆绑美女| 国产伦精品一区二区三区在线观看 | 狠狠操狠狠色综合网| 亚洲欧美日本日韩| 欧美一级大片在线免费观看| 欧美午夜剧场| 亚洲特级毛片| 欧美在线视频二区| 国产在线欧美| 久久夜色精品国产噜噜av| 免费成人高清| 在线免费高清一区二区三区| 美女视频一区免费观看| 亚洲国产婷婷香蕉久久久久久99 | 亚洲韩国日本中文字幕| 老司机久久99久久精品播放免费| 美女黄毛**国产精品啪啪| ●精品国产综合乱码久久久久| 久久亚洲捆绑美女| 亚洲国产高清高潮精品美女| 日韩午夜激情| 欧美系列精品| 亚洲欧美日本国产有色| 久久视频国产精品免费视频在线| 极品裸体白嫩激情啪啪国产精品 | 91久久国产综合久久| 一本高清dvd不卡在线观看| 国产精品igao视频网网址不卡日韩| 亚洲一级黄色| 蜜臀av一级做a爰片久久| 亚洲精品免费一二三区| 欧美中文字幕视频在线观看| 久久米奇亚洲| 亚洲美女少妇无套啪啪呻吟| 午夜视频一区| 在线观看欧美成人| 欧美色偷偷大香| 久久精品夜夜夜夜久久| 亚洲精品中文字幕在线| 欧美综合77777色婷婷| 亚洲国产精品久久| 国产精品久久久久久一区二区三区| 久久激情视频| 一区二区三区www| 免费在线看成人av| 亚洲一区二区久久| 永久555www成人免费| 欧美色中文字幕| 免费高清在线视频一区·| 一区二区不卡在线视频 午夜欧美不卡在 | 午夜国产精品影院在线观看 | 一本久久知道综合久久| 国产三级欧美三级日产三级99| 欧美mv日韩mv国产网站app| 亚洲图片欧洲图片av| 欧美福利在线| 欧美影院视频| 亚洲网友自拍| 亚洲区第一页| 国内精品久久久久影院优| 欧美日韩亚洲高清一区二区| 欧美成年人视频网站欧美| 久久国产精品第一页 | 久久精品亚洲乱码伦伦中文 | 亚洲午夜精品一区二区三区他趣| 亚洲成人在线免费| 国产一区欧美| 国产视频精品va久久久久久| 欧美午夜激情小视频| 欧美精品一区在线发布| 奶水喷射视频一区| 久久久精品一区| 欧美影院精品一区| 亚洲男女自偷自拍图片另类| 一本一道久久综合狠狠老精东影业| 亚洲国产精品第一区二区| 欧美成人dvd在线视频| 久久亚洲精品中文字幕冲田杏梨| 久久精品成人一区二区三区蜜臀| 亚洲综合另类| 亚洲欧洲99久久| 亚洲免费在线播放| 亚洲淫片在线视频| 午夜日韩av| 久久精品国产99| 久久精品系列| 免费视频亚洲| 亚洲黄色成人久久久| 亚洲国产三级网| 亚洲精品免费观看| 亚洲美女性视频| 亚洲一区二区三区在线| 欧美一级久久久| 久久久7777| 另类av导航| 欧美极品一区二区三区| 国产精品二区三区四区| 国产精品久久久久久久久久尿| 国产精品嫩草99a| 欧美性淫爽ww久久久久无| 午夜精品久久久久久久99水蜜桃| 亚洲素人一区二区| 亚洲午夜小视频| 欧美有码视频| 久久性天堂网| 亚洲欧洲精品一区二区| 一本色道久久精品| 欧美一级片一区| 六月丁香综合| 欧美三级电影网| 国内精品免费在线观看| 亚洲精品日韩久久| 欧美亚洲一区在线| 欧美激情1区2区| 亚洲婷婷免费| 免费视频久久| 国产精品精品视频| 伊人久久大香线蕉av超碰演员| 亚洲人成在线观看| 久久成人国产精品| 亚洲二区在线| 亚洲综合久久久久| 免费在线国产精品| 国产精品视频第一区| 亚洲国产婷婷香蕉久久久久久99 | 一本不卡影院| 久久亚洲国产成人| 99re66热这里只有精品3直播| 欧美午夜精彩| 乱人伦精品视频在线观看| 亚洲人成精品久久久久| 美女亚洲精品| 欧美一区综合| 久久天天躁狠狠躁夜夜爽蜜月| 欧美精品在线观看91| 国内自拍一区| 亚洲伊人网站| 亚洲精品乱码久久久久久日本蜜臀| 欧美综合国产精品久久丁香| 欧美三日本三级少妇三2023|