在C語言中,大括號“{}”是一類比較特殊的符號。如果能夠在適當的地方利用它,可使代碼看起來非常的整潔,也能夠從側面體現出一個編程人員的專業修養。
那麼,在C語言中,大括號應該用在哪些地方呢?
1.初始化數組變量
在實際的軟件開發項目中,變量在使用前應初始化,防止未經初始化的變量被引用。
對於數組變量來說,恰當的初始化樣例如下:
char szString[100] = {0};
定義了一個名為szString的包含100個字節的數組變量,並將該數組中每個變量的初始值賦為0。
2. 定義和初始化結構體變量
結構體變量的定義方法的樣例如下:
typedef struct
{
……
}T_Struct;
該結構體變量的初始化樣例如下:
T_Struct tStruct = {0};
很多開發人員都不注重對結構體變量進行初始化,這是不對的。要牢記的是,任何變量在使用前,都應進行初始化。
3. 用在if、else、else if、for、while、do等語句中
在實際的軟件開發項目中,if、else、else if、for、while、do等語句用得較多,對這些語句的書寫要求如下:
(1)自占一行,執行語句不得緊跟其後。不論執行語句有多少都要加“{ }”。
這樣做的目的是便於閱讀,同時也有利於代碼的維護。
假設定義了兩個整型變量iIntVal1和iIntVal2,如果iIntVal1的值小於iIntVa2,那麼就將iIntVal2的值賦給iIntVal1,則正反示例為:
反例:
if (iIntVal1 < iIntVal2) iIntVal1 = iIntVal2;
這樣寫出來的程序可讀性很差,不利於對流程的跟蹤及對版本的維護。
正例:
if (iIntVal1 < iIntVal2)
{
iIntVal1 = iIntVal2;
}
該代碼和反例中的代碼相比,簡潔清晰,讓人一目了然。
(2)程序的分界符“{”和“}”應獨占一行並且位於同一列,同時與引用它們的語句左對齊。“{ }”之內的代碼塊使用縮進規則對齊(一般縮進4個空格)。
同樣以兩個整型變量iIntVal1和iIntVal2的比較來說明,正例如上面(1)所示。
反例:
if (iIntVal1 < iIntVal2)
{
iIntVal1 = iIntVal2;
}
該代碼看起來給人一種很凌亂的感覺,不便於閱讀和維護。
4. 用在switch語句中
switch語句也經常出現在產品代碼中,要想寫出邏輯清晰、可閱讀性強的switch語句,需要遵循以下規則:
(1)一定要加上default分支,即使case分支已經將全部情況都包括了。
這樣做是為了防止其它代碼閱讀者誤以為漏寫了default分支,也可表現出開發人員的思維的全面性。
(2)一個case分支和default分支要用“{ }”括起來,“{ }”中的內容需要縮進(一般縮進4個空格)。
這樣做可使程序邏輯清晰,可讀性更好。
假設定義了一個整型變量iSwitchFlag,可取值1、2、3,用switch語句對每種可取值的情況分別進行處理,則正反示例為:
反例:
switch (iSwitchFlag) { //“{”沒有和switch對齊 case 1: //“case”沒有縮進 { //“{”沒有和case對齊 DoSomething1(); //縮進空格數太多 break; } //“}”沒有和本case語句的“{”對齊 case 2: { DoSomething2(); break; } case 3: DoSomething3(); //沒有用“{}”將語句括起來,且case執行結束後無break; //缺少了default分支 }
以上反例中的switch語句可讀性很差,不利於代碼的維護。
正例:
switch (iSwitchFlag) { case 1: { DoSomething1(); //縮進4個空格 break; } case 2: { DoSomething2(); //縮進4個空格 break; } case 3: { DoSomething3(); //縮進4個空格 break; } default: //一定要有default分支 { DoNothing(); break; } }
正例中的代碼邏輯清晰,有利於代碼的修改和維護。
(3) break語句要寫到“{}”的裡面,這樣可以體現出程序塊的整體性,便於閱讀。
如下的代碼是不規范的:
switch (iSwitchFlag) { case 1: { DoSomething1(); } break; // break語句放到了“{}”外面,不規范 case 2: { DoSomething2(); } break; case 3: { DoSomething3(); } break; default: { DoNothing(); } break; }
5. 用在函數中
眾所周知,一個函數中的所有語句是包括在“{}”之中的。除此之外,“{}”在函數之中還有其它用武之地。
(1)分隔功能關聯不大的語句塊
在某些函數中,可能包含了很多功能,但這些功能之間的關聯性很小,可以當作獨立的代碼來對待。這時,可以用“{}”將這些不同功能的代碼塊區分開來,增強代碼的可讀性,也便於對函數的維護和修改。
假設有一個函數ExampleFun,包含了三個較為獨立的功能A、B和C,則可以如下組織該函數的代碼。
void ExampleFun(void) { //功能A代碼塊開始 { //功能A的實現代碼 } //功能A代碼塊結束 //功能B代碼塊開始 { //功能B的實現代碼 } //功能B代碼塊結束 //功能C代碼塊開始 { //功能C的實現代碼 } //功能C代碼塊結束 }
這樣的代碼具有自說明性,便於閱讀和維護,提高了工作效率。
(2)突出添加或修改的代碼
在代碼行數較多的函數中,如果要添加或修改的代碼量很少,即與原本已有的代碼比起來,顯得“很渺小”。這時,可以用“{}”將添加或修改的代碼括起來,以突出代碼的改動,方便閱讀及對代碼進行走查等。
同樣以函數ExampleFun為例來說明,如下所示:
void ExampleFun(void) { …… …… …… …… …… //修改或添加代碼塊開始 { //修改或添加的代碼 } //修改或添加代碼塊結束 …… …… …… …… …… }
這樣,很容易發現代碼的改動,閱讀或維護起來也比較的容易。
總的說來,善於在代碼中運用“{}”,可以提高代碼的規范性,進而提高代碼質量及工作的效率。
代碼的規范性是一個永恆的話題,廣大的軟件開發工程師在提高自己編程水平的同時,也要注重編程規范,讓自己的代碼更易於閱讀和維護。