程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 高質量C/C++編程指南--表達式和基本語句

高質量C/C++編程指南--表達式和基本語句

編輯:C++入門知識

此系列文章實為對《高質量程序設計指南--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 語句。

 


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved