4.1 運(yùn)算符的優(yōu)先級(jí)
規(guī)則4-1-1 如果代碼行中的運(yùn)算符比較多,用括號(hào)確定表達(dá)式的操作順序,避免使用默認(rèn)的優(yōu)先級(jí)。
4.2 復(fù)合表達(dá)式
規(guī)則4-2-1 不要編寫(xiě)太復(fù)雜的復(fù)合表達(dá)式。
規(guī)則4-2-2 不要有多用途的復(fù)合表達(dá)式。
規(guī)則4-2-3 不要把程序中的復(fù)合表達(dá)式與“真正的數(shù)學(xué)表達(dá)式”混淆。
4.3 if 語(yǔ)句
4.3.1 布爾變量與零值比較
規(guī)則4-3-1不可將布爾變量直接與TRUE、FALSE或者1、0進(jìn)行比較。
假設(shè)布爾變量名字為flag,它與零值比較的標(biāo)準(zhǔn)if語(yǔ)句如下:
if (flag) // 表示flag為真
if (!flag) // 表示flag為假
注:TRUE的值究竟是什么并沒(méi)有統(tǒng)一的標(biāo)準(zhǔn)。根據(jù)布爾類型的定義,零值為“假”(記為 FALSE),任何非零值都是“真”(記為T(mén)RUE)。
4.3.2 整型變量與零值比較
規(guī)則4-3-2應(yīng)當(dāng)將整型變量用“==”或“!=”直接與 0 比較。
if (value == 0)
4.3.3 浮點(diǎn)變量與零值比較
規(guī)則4-3-3不可將浮點(diǎn)變量用“==”或“!=”與任何數(shù)字比較。
if ((x >= -EPSION) && (x <= EPSION)) // 其中EPSION是允許的誤差(即精度)。
4.3.4 指針變量與零值比較
規(guī)則4-3-4應(yīng)當(dāng)將指針變量用“==”或“!=”與 NULL 比較。
4.3.5 對(duì) if語(yǔ)句的補(bǔ)充說(shuō)明
將if (p == NULL)誤寫(xiě)成if (p = NULL),而有意把p和NULL顛倒。編譯器認(rèn)為if (p = NULL)是合法的,但是會(huì)指出if (NULL = p)是錯(cuò)誤的,因?yàn)镹ULL不能被賦值。
程序中有時(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ǔ)句的效率
提高循環(huán)體效率的基本辦法是降低循環(huán)體的復(fù)雜性。
建議4-4-1 在多重循環(huán)中,如果有可能,應(yīng)當(dāng)將最長(zhǎng)的循環(huán)放在最內(nèi)層,最短的循環(huán)放在最外層,以減少 CPU 跨切循環(huán)層的次數(shù)。
建議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)“流水線”作業(yè),使得編譯器不能對(duì)循環(huán)進(jìn)行優(yōu)化處理,降低了效率。如果 N 非常大,最好采用示例 4-4(d)的寫(xiě)法,可以提高效率。如果 N 非常小,兩者效率差別并不明顯,采用示例 4-4(c)的寫(xiě)法比較好,因?yàn)槌绦蚋雍?jiǎn)潔。
4.5 for 語(yǔ)句的循環(huán)控制變量
規(guī)則4-5-1不可在for 循環(huán)體內(nèi)修改循環(huán)變量,防止for 循環(huán)失去控制。
建議4-5-1 建議 for 語(yǔ)句的循環(huán)控制變量的取值采用“半開(kāi)半閉區(qū)間”寫(xiě)法。
4.6 switch語(yǔ)句
switch是多分支選擇語(yǔ)句。
規(guī)則4-6-1 每個(gè) case 語(yǔ)句的結(jié)尾不要忘了加 break,否則將導(dǎo)致多個(gè)分支重疊(除非有意使多個(gè)分支重疊)。
規(guī)則4-6-2 不要忘記最后那個(gè) default 分支。即使程序真的不需要 default 處理,也應(yīng)該保留語(yǔ)句 default : break; 這樣做并非多此一舉,而是為了防止別人誤以為你忘了 default 處理。
4.7 goto語(yǔ)句
跳出多重循環(huán)體中。