2.1. 表達式
46.在標準的允許下,在任何賦值序列的情況下表達式的值應該一樣(R)
該規則的目的是避免由表達式引起的對變量的邊緣影響。
例如:
int myfunc()
{
int i = 1;
int a = 2;
a = (i++) + (i--); /* 與規則衝突 */
}
47.在C語句的處理過程中,通過添加非依賴性的標識來而不是採用C的默認處理順序(A)
另外,還要避免C語句過長,從而增加閱讀的難度係數。
例如
x = (a*5) + (b/6);
48.混合精度的數學表達式應該採用顯示的數據轉換產生期望的結果。(A)
49.對於不使用0的值應該明顯檢查,除非操作是針對布爾型(A)
例如:
float a = 0.0;
float b = 1.0;
float c = 0.0;
c = b/a; /* 與規則49衝突*/
50.浮點變量不應該採用準確的等於或不等於進行比較(R)
例如:
float a = 1.0, b = 2.0;
float c = 1.0;
if (a == c) { … } /* 與規則衝突 */
if (a != b ) {….} /* 與規則衝突 */
51.常數無符號整型表達式的賦值應該不會引起wrap-around(A)
#if (1u – 2u) /* 違反規則 */
…..
#endif
2.2. 控制流
52.不存在無法被執行到的代碼(R)
53.所有的非空句子應該具有邊緣影響(R)
例如
int a = 9;
a = a; /* 違反規則 */
54.空語句只能單獨一行出現,並且不允許在該語句中有任何文本內容(R)
55.除了Switch語句,不能出現任何Label(A)
56.不能使用goto語句(R)
57.不能使用continue語句(R)
58.除非是要介紹switch語句,break語句不允許使用(R)
59.由if,else if,else,while,do…while或for構成的句子應該用括號括起來(R)
例如
if (a == b){
a = 5; /* OK */
} else
b = 5; /* 違反規則 */
60.所有的if 和 else if結構最後都要包含最終的else句子(A)
61.switch句子中,所有的非空case語句最後都要有break語句(R)
62.所有的switch句子都應該包含一個最終的default句子(R)
63.switch中的表達式不能表示一個布爾值(A)
例如
switch (a == b) { /* 違反規則 63 */
case ….
}
64.每一個switch語句至少有一個case句子(R)
例如
switch(…) {
default: …; /* 違反規則 64 */
}
65.浮點變量不能用作循環的計算器(R)
例如
float i = 0.0;
for(i = 0.0; i < 100.0; i += 1.0) { /* 違反規則 65*/
}
66.在for語句中用於循環控制的只能是表達式(A)
例如
int j = 0;
for (j = 0; 1; j ++) { /* 違反規則 66*/
….
}
67.用於for循環迭代計算的數值變量不能在循環體內被修改變量(A)
int j = 0;
for (j = 0; j < 10; j ++) {
j = j+2; /* 違反規則 67*/
}