此系列文章實為對《高質量程序設計指南--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進行比較
正確做法如下:
[cpp]
if (flag) // 表示flag為真
if (!flag) // 表示flag為假
// 下面的屬於不良風格
if (flag == TRUE)
if (flag == FALSE)
if (flag == 1)
if (flag == 0)
整型變量與零值比較:
應當將整型變量用“ == ” 或 “ != ” 直接與 0 比較
正確做法如下:
[cpp]
if (value == 0)
if (value != 0)
// 以下的寫法會讓人誤解為布爾變量
if (value)
if (!value)
浮點變量與零值比較:
不可將浮點變量用 " == " 或 " != " 與任何數字比較
因為浮點類型具有精度限制,所以應該設法轉化為 " >= " 或 " <= "形式
所以應該將
[cpp]
if (x == 0.0)
轉化為
[cpp]
if ((x>=-EPSINON) && (x<=EPSINON)) //其中EPSINON是允許的誤差(即精度)
指針變量與零值比較:
應將指針變量用 " == " 或 " != " 與NULL比較
盡管 NULL 的值與 0 相同,但是兩者意義不同。
[cpp] view plaincopyprint?
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 處理www.2cto.com
goto語句
雖然 goto 會破壞結構化設計風格。它可能會跳過了某些對象的構造、變量的初始化、重要的計算等語句而造成錯誤或隱患。也因此 goto 通常不被推薦使用。但其的一個作用是不能忽略的:就是從多重循環一下子就能跳到循環外,不需要多個 break 語句。