2010-11-22 60 views
30

在流量控制的C switch-case中,如果在該塊中定義了變量,則需要在case之後放置大括號{}C每個案例之後的開關大括號

無論變量聲明如何,在每個case之後插入大括號是否是不好的做法?

例如:

switch(i) { 
    case 1: { 
    int j = 4; 
    ...code... 
    } break; 

    case 2: { //No variable being declared! Brace OK? 
    ...code... 
    } break; 
} 

回答

33

在每個大小寫塊中使用大括號當然不是無效的,它也不一定是壞的風格。如果由於變量聲明而使用了大括號,那麼向別人添加大括號可以使編碼風格更加一致。這就是說,在直接C中聲明變量塊內的變量可能不是一個好主意。儘管編譯器可能允許這樣做,但可能有更清晰的解決方案。相互獨佔的大小寫塊可能能夠共享幾個常見的臨時變量,或者您可能會發現您的大小寫塊作爲輔助函數可以更好地工作。

+2

只需要注意 - 可以在第一種情況之前在開關的開始處聲明變量(並因此在不添加更多花括號的情況下共享這些變量。 – martinkunev 2016-01-14 16:04:37

8

牙套可以在每種情況下語句中使用而沒有任何速度的損失,由於方式的編譯器優化代碼。所以這只是編碼器的風格和偏好。

  • 最優選使用不使用大括號,但他們在任何情況下一個活躍的開發過程中的使用可能會發現更容易做出一些補充的代碼飄飛。

  • 這只是東方美學;因爲'case'語句不只需要一個命令,而是會在代碼中作爲標籤工作。所以塊不是必需的,並且不是無效的。

  • 在'有變數的情況下;使用大括號來爲變量創建上下文,使用它們非常有意義。如果不包括在不同平臺上的一些編譯器顯示不同的行爲。

+0

你知道是否有速度懲罰,或只是風格點損失? – Ben 2010-11-22 01:56:25

+0

沒有速度懲罰,它編譯像你沒有他們。我正在編輯包含此內容的答案。 – SuperDuck 2010-11-22 09:33:35

+0

謝謝Duck,不幸的@ bta的解決方案在我的頭腦中有點清晰,但+1幫助你。 – Ben 2010-11-23 05:26:34

0

我認爲在每個case中使用花括號是很糟糕的風格。案例是C中的標籤,類似於goto標籤。在當前的C語言中,您可以自由地在每個case(或任何你喜歡的地方)聲明變量,而不需要引入新的塊,儘管有些人(包括我自己)也會考慮這種糟糕的風格。

+2

但是如果你不分隔塊,你在'case'中聲明的任何變量將在下一個塊中可用。如果你有任何大的「開關」,它可能會產生一些令人討厭的錯誤;更好的分隔塊,或者將它們減少到比函數調用更多的地步。 – Javier 2010-11-22 01:50:31

+0

@R和其他人 - 啊 - 所以在塊中定義變量的實際做法可能很糟糕? – Ben 2010-11-22 01:54:42

+0

@Javier - 我的一些編譯器沒有大括號就崩潰了; 「在下一個可用」顯然不會發生... – Ben 2010-11-22 01:55:35

5

通常不好的做法是跳過變量的初始化,使用gotoswitch。當您沒有case的塊時,會發生這種情況。

在C99中甚至有一種情況是跳過初始化是非法的,即可變長度數組。它們必須與C++中的非POD類似地「構造」,它們的初始化對於稍後訪問該變量是必需的。所以在這種情況下你必須使用塊語句。

+0

+1爲什麼在'switch'中初始化一個var是不好的,謝謝你的想法。 – Ben 2010-11-23 05:19:23

0

只是爲了添加一個小點許多編輯器& IDE允許塊被摺疊和/或自動縮進,並且有幾個允許你跳轉到匹配的支撐 - 我個人不知道任何允許你從打破匹配的案例陳述。

當調試或重新構造其他人(甚至在幾個月後你自己的)時,包含複雜case語句的代碼能夠摺疊代碼段並跳轉到匹配的情況是非常有價值的, 特別是如果代碼包含縮進變體

這就是說,幾乎總是很好的建議,以避免像鼠疫這樣複雜的病例陳述。