2016-03-15 34 views
1

我一直在課堂上開展一個項目,迄今爲止我寫的代碼工作得很好。我的代碼的很大一部分使用嵌套的switch語句。雖然我打算按照現在的方式進行操作,但我希望知道將來的參考是否嵌套的switch語句通常被忽略。在C++中使用嵌套切換語句是不好的做法嗎?

+1

難道你不想顯示代碼嗎? –

+2

我認爲這是基於意見的方式。例如,我絕對討厭開關,從不使用它們。我使用if-else-if的鏈。這讓許多人上了一堵牆,他們的轉變也是如此。我可以想象嵌套開關*特別*壞,但我討厭單個開關。看到問題了嗎? – 2016-03-15 08:49:15

+0

這真的歸結爲你在做什麼。有時候這是最好的選擇。有時候這是不必要的。如果你能避免它,通常不會嵌套循環便宜。但是,代碼本身的複雜性增加了很多,所以如果嵌套循環是正確的方法,那麼很好。但是,如果您開始獲取超過3個嵌套循環,請嘗試使其遞歸。 –

回答

2

正如你可能已經注意到的那樣,因爲你問,他們不是最容易遵循的事情,所以我通常會盡可能避免它們。

這並不意味着你不能做這種控制流 - 訣竅是將案例分解成自己的功能。這讓有人閱讀頂級開關,理解它的分支以及發生了什麼(因爲你當然會給你的函數帶來好的描述性名稱),然後他們可以依次檢查每個函數,以便了解下一級是否需要。

爲了避免以前不必要的函數調用的代價,可以標記函數inline以使編譯器有效地將函數的主體複製到調用站點。

它最終會看起來像這樣令人難以置信的genericised和不完整的骨架:

int main() { 
    int thing; 
    char second_level_thing; 

    // various code which produces thing and second_level_thing 

    switch (thing) { 
    case 0: do_zero_case(second_level_thing); break; 
    case 1: do_one_case(); break; 
    default: do_default_case(); break; 
    } 

    // the rest of main 
} 

inline void do_zero_case(char second_level_thing) { 
    switch (second_level_thing) { 
    case 'a': // 0 -> a branch code 
    // etc... 
    } 
} 

// etc... 

打電話給你的功能之類的東西do_zero_case!在它實際上確實之後命名它們。

我會補充說,如果多個層面檢查相同的價值有一些非常奇怪的事情發生。

也有通過使用OOP技術(各種形式的虛擬方法調用),模板,高階函數等可用的替代控制流。有時候一個簡單的switch聲明或兩個聲明正是你需要的!

0

一般來說,如果switch語句對於處理器的計算而言更加「昂貴」,因爲每次跳轉時都要強制彙編器進行新的猜測(以瞭解下一條指令的內容) 。如果您主要關心的是算法效率,儘量少用。

相關問題