高質量C C 程式設計指南 表示式和基本語句

2021-06-10 19:53:39 字數 3986 閱讀 1930

此系列文章實為對《高質量程式設計指南--c++/c語言》的重點摘要總結

本篇總結的為表示式和基本語句:

運算子的優先順序:

優先順序運算子

名稱或含義

使用形式

結合方向說明1

陣列下標

陣列名[常量表示式]

左到右()

圓括號(表示式)/函式名(形參表)

.成員選擇(物件)

物件.成員名

->

成員選擇(指標)

物件指標->成員名2-

負號運算子

-表示式

右到左單目運算子

(型別)

強制型別轉換

(資料型別)表示式

++自增運算子

++變數名/變數名++

單目運算子

--自減運算子

--變數名/變數名--

單目運算子

*取值運算子

*指標變數

單目運算子

&取位址運算子

&變數名

單目運算子

!邏輯非運算子

!表示式

單目運算子

~按位取反運算子

~表示式

單目運算子

sizeof

長度運算子

sizeof(表示式)3/

除表示式/表示式

左到右雙目運算子*乘

表示式*表示式

雙目運算子

%餘數(取模)

整型表示式/整型表示式

雙目運算子4+

加表示式+表示式

左到右雙目運算子-減

表示式-表示式

雙目運算子

5<<

左移變數《表示式

左到右雙目運算子

>>

右移變數》表示式

雙目運算子

6>

大於表示式》表示式

左到右雙目運算子

>=

大於等於

表示式》=表示式

雙目運算子

<

小於表示式《表示式

雙目運算子

<=

小於等於

表示式<=表示式

雙目運算子7==

等於表示式==表示式

左到右雙目運算子

!=不等於

表示式!= 表示式

雙目運算子8&

按位與表示式&表示式

左到右雙目運算子9^

按位異或

表示式^表示式

左到右雙目運算子10|

按位或表示式|表示式

左到右雙目運算子

11&&

邏輯與表示式&&表示式

左到右雙目運算子

12||

邏輯或表示式||表示式

左到右雙目運算子

13?:

條件運算子

表示式1? 表示式2: 表示式3

右到左三目運算子14=

賦值運算子

變數=表示式

右到左/=

除后賦值

變數/=表示式

*=乘後賦值

變數*=表示式

%=取模後賦值

變數%=表示式

+=加後賦值

變數+=表示式

-=減後賦值

變數-=表示式

<<=

左移後賦值

變數<<=表示式

>>=

右移後賦值

變數》=表示式

&=按位與後賦值

變數&=表示式

^=按位異或後賦值

變數^=表示式

|=按位或後賦值

變數|=表示式15,

逗號運算子

表示式,表示式,…

左到右從左向右順序運算

運算子優先順序表的

出處運算子不難記,優先順序和結合性才是比較難記的!

所以建議:如果**行中的運算子比較多,用括號確定表示式的操作順序比較好。能避免使用預設的優先順序,尤其在忘記優先順序的情況下。

if 語句(與零值比較)

布林變數與零值比較:

不可將布林變數直接與 true、false 或1、0進行比較

正確做法如下:

if (flag)   // 表示flag為真

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

// 下面的屬於不良風格

if (flag == true)

if (flag == false)

if (flag == 1)

if (flag == 0)

整型變數與零值比較:應當將整型變數用「 == 」 或 「 != 」 直接與 0 比較

正確做法如下:

if (value == 0)

if (value != 0)

// 以下的寫法會讓人誤解為布林變數

if (value)

if (!value)

浮點變數與零值比較:

不可將浮點變數用 " == " 或 " != " 與任何數字比較

因為浮點型別具有精度限制,所以應該設法轉化為" >= "" <= "形式

所以應該將

if (x == 0.0)
轉化為

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

指標變數與零值比較:

應將指標變數用 " == " 或 " != " 與null比較

儘管 null 的值與 0 相同,但是兩者意義不同。

if (p == null)

if (p != null)

//以下寫法讓人誤解是整型變數

if (p == 0)

if (p != 0)

//以下寫法讓人誤解是布林變數

if (p)

if (!p)

有時候可能會看到if (null == p)這種比較古怪的格式,這並不是程式寫錯了,而是程式設計師為了防止將if (p == null)誤寫成if (p = null)。編譯器認為if (p = null)是合法的,但會指出if (null = p)是錯誤的,因為其不能被賦值。

迴圈語句的效率

建議:在多重迴圈中,如果有可能,我們應該盡力將最長迴圈放在最內層,最短放在最外層。以減少cpu跨切迴圈層的次數

如果迴圈體內存在邏輯判斷,並且迴圈次數很大,宜將邏輯判斷移到迴圈體的外面

不可在for迴圈體內修改迴圈變數,防止for迴圈失去控制

建議for語句的迴圈控制變數的取值採用「 半開半閉區間 」寫法

switch語句

每個case語句的結尾都須加上 break ,除非有意使多個分支重疊

不要忘記最後那個 default 分支,即使程式不需要,也須保留。因為這是為了防止別人誤以為你忘了 default 處理

goto語句

雖然 goto 會破壞結構化設計風格。它可能會跳過了某些物件的構造、變數的初始化、重要的計算等語句而造成錯誤或隱患。也因此 goto 通常不被推薦使用。但其的乙個作用是不能忽略的:就是從多重迴圈一下子就能跳到迴圈外,不需要多個 break 語句。

高質量C C程式設計指南

1.如果引數是指標,且僅作輸入用,則應在型別前加const,以防止該指標在函式體內被意外修改 2.在函式體的 入口處 對引數的有效性進行檢查 在函式體的 出口處 對return語句的正確性和效率進行檢查 3.引用的一些規則如下 1 引用被建立的同時必須被初始化 指標則可以在任何時候被初始化 2 不能...

高質量C C程式設計指南

目錄 前 言.6 第1章檔案結構 11 1.1 版權和版本的宣告 11 1.2 標頭檔案的結構 12 1.3 定義檔案的結構 13 1.4 標頭檔案的作用 13 1.5 目錄結構 14 第2章程式的版式 15 2.1 空行.15 2.2 行.16 2.3 行內的空格 17 2.4 對齊.18 2.5...

高質量C C程式設計指南 5

第5章常量 常量是一種識別符號,它的值在執行期間恆定不變。c語言用 define來定義 常量 稱 為巨集常量 c 語言除了 define外還可以用 const來定義 常量 稱 為const 常量 5.1為什麼需要常量 如果不使用常量,直接在程式中填寫數字或字串,將會有什麼麻煩?1 程式的可 讀性 可...