讀者可能懷疑:連if、for、while、goto、switch這樣簡單的東西也要探討編程風格,是不是小題大做?我真的發覺很多程序員用隱含錯誤的方式寫表達式和基本語句,我自己也犯過類似的錯誤。表達式和語句都屬於C++/C的短語結構語法。它們看似簡單,但使用時隱患比較多。本章歸納了正確使用表達式和語句的一些規則與建議。
4.1 運算符的優先級
C++/C語言的運算符有數十個,運算符的優先級與結合律如表4-1所示。注意一元運算符 + - * 的優先級高於對應的二元運算符。
優先級運算符結合律從
高
到
低
排
列
( ) [ ] -> .從左至右! ~ ++ -- (類型) sizeof + - * &從右至左* / %從左至右+ -從左至右<< >>從左至右< <= > >=從左至右== !=從左至右&從左至右^從左至右|從左至右&&從左至右||從右至左? :從右至左= += -= *= /= %= &= ^= |= <<= >>=從左至右表4-1 運算符的優先級與結合律
【規則4-1-1】如果代碼行中的運算符比較多,用括號確定表達式的操作順序,避免使用默認的優先級。
由於將表4-1熟記是比較困難的,為了防止產生歧義並提高可讀性,應當用括號確定表達式的操作順序。例如:
word = (high << 8) | low
if ((a | b) && (a & c))
4.2 復合表達式
如 a = b = c = 0這樣的表達式稱為復合表達式。允許復合表達式存在的理由是:(1)書寫簡潔;(2)可以提高編譯效率。但要防止濫用復合表達式。
【規則4-2-1】不要編寫太復雜的復合表達式。
例如:
i = a >= b && c < d && c + f <= g + h ; // 復合表達式過於復雜
【規則4-2-2】不要有多用途的復合表達式。
例如:
d = (a = b + c) + r ;
該表達式既求a值又求d值。應該拆分為兩個獨立的語句:
a = b + c;
d = a + r;
【規則4-2-3】不要把程序中的復合表達式與“真正的數學表達式”混淆。
例如:
if (a < b < c) // a < b < c是數學表達式而不是程序表達式
並不表示 if ((a<b) && (b<c))
而是成了令人費解的 if ( (a<b)<c )
4.3 if 語句
if語句是C++/C語言中最簡單、最常用的語句,然而很多程序員用隱含錯誤的方式寫if語句。本節以“與零值比較”為例,展開討論。
4.3.1 布爾變量與零值比較
【規則4-3-1】不可將布爾變量直接與TRUE、FALSE或者1、0進行比較。
根據布爾類型的語義,零值為“假”(記為FALSE),任何非零值都是“真”(記為TRUE)。TRUE的值究竟是什麼並沒有統一的標准。