2016-12-01 63 views
0

我有我檢查了某種屬性,如果檢查產生一個特定的值,我想檢查另一個值開關,所以我做了這樣的事情:是沒有打破壞習慣的開關櫃?

switch(property_A) 
{ 
case NA: 
    if(value_0 == property_B) 
     property_A = value_a; 
    else if(value_1 == property_B) 
     property_A = value_b; 
case value_0: 
... 
break; 
case value_1: 
... 
break; 
} 

所以,我知道這解決我的問題,但我不知道這是一個好主意,或者我應該去這個另一種方式

#NA案件是像默認情況下,但不完全是因爲它告訴我的東西,但還不夠

+1

如果你想預成型什麼的'NA後跳轉到正確的情況下, ',它不會工作。 – StoryTeller

+1

通常情況下允許一個案件「跌倒」到下一個案件。但是,你所做的並不是「檢查另一個值」。如果修改開啓的值並想從一開始就運行'switch',則需要一個循環。 –

+2

如果您碰到'case NA',您是否希望'case value_o'中的代碼執行? – nos

回答

4

這取決於你想要做什麼。如果您遇到NA的情況,而沒有break關鍵字,則value_0大小寫將在兩個if分支中的一個完成後執行。所以,如果這是你想要的行爲,那麼可以不使用break,但我不認爲這就是你想要做的。

我建議你簡單地將if - else語句移動到switch以上並刪除NA的情況。這樣,您將首先將正確的數據分配給property_A,然後您可以在switch中對其執行任何操作。

編輯︰作爲Jack Deethpoints out,如果你故意省略break聲明,最好添加一個你這樣做的評論。

3

約定會添加一個明確地告訴未來的評論 - 你和其他任何維護者,你沒有意外地忽略了break;

switch(foo) { 
case 1: 
    bar(); 
    // fallthrough 
case 2: 
    baz(); 
    break; 
case 3: 
    fizzbuzz(); 
} 

如果您使用C++ 17或更高版本可以使用[[fallthrough]]屬性來避免編譯器警告:

switch(foo) { 
case 1: 
    bar(); 
    [[fallthrough]] 
case 2: 
    baz(); 
    break; 
case 3: 
    fizzbuzz(); 
} 
+1

我確實添加了一條評論,但想知道即使有評論這是不是一個壞習慣 – CIsForCookies

2

在評論的問題提供的附加信息表明什麼就想是不是有什麼寫在了一個問題:

switch(property_A) 
{ 
    case NA: 
    if(value_0 == property_B) 
     property_A = value_a; 
    else if(value_1 == property_B) 
     property_A = value_b; 
    // here, we fallthrough into the code for value_0 
    // but you want to switch on the new value instead 
    case value_0: 
    ... 
    break; 
} 

你說什麼,你真正想要的是設置property_A如果它最初NA,然後跳轉到正確的標籤。在這種情況下,您需要將分配置於switch聲明之外。你可以用gotoNA案件結束做到這一點,但我建議你在切換之前剛處理NA

if (property_A==NA) 
    property_A = (value_0 == property_B) ? value_a 
       : (value_1 == property_B) ? value_b 
       : NA; 

switch (property_A) { 
    case value_0: 
    ... 
    break; 
    case NA: 
    // we get here only if none of the replacement conditions 
    // matched, outside the 'case' 
}