2009-07-23 83 views
15

當我在case的代碼塊周圍使用大括號來定位變量時,我應該把break放在塊的內部還是外部?在哪裏把break在開關/ case語句中與塊

case FOO: // 'break' inside 
    { 
    int i; 
    doStuff(); 
    break; 
    } 

case BAR: // 'break' outside 
    { 
    int i; 
    doStuff(); 
    } 
    break; 

謝謝。

+0

請問您能澄清一下嗎;問題是沒有道理的...... – 2009-07-23 11:12:50

+4

我認爲它很有意義 – 2009-07-23 11:16:58

+0

儘管有意義,但代碼示例將無一例外地使其更加清晰 – dmckee 2009-07-23 15:09:20

回答

19

這是一個風格問題。

我會把break放在右大括號之外,這樣才能使它更具可讀性。

2

它確實取決於你的代碼的邏輯以及它如何使用大括號,但爲了正確的答案,如果你把它放在裏面,試着把它們全部放在裏面。

14

你把它放在任何你喜歡的地方。確保你在整個項目中保持一致。 (我個人把它放在外面。)

+0

一致性規則!+1 – xtofl 2009-07-23 11:42:32

+0

一致性+1 :-) – 2009-07-23 14:53:41

+0

+1 I + 1剛剛毀了你的@xtofl一致性。 @MartinYork;) – 2011-03-06 20:13:35

4

我通常把break的括號內,像這樣:

switch (foo) { 
    case bar: { 
     int x = 5; 
     printf("%d\n", x); 
     break; 
    } 
    case baz: { 
     // ... 
     break; 
    } 
} 

然而,因爲這是我的規則我可以​​自由地打破它(沒有雙關語意),每當我想要的。

1

在我看來,你應該避免switch語句中的局部變量和塊。無論如何,你也應該避免長時間或複雜甚至級聯的開關語句。 但沒有規則沒有例外......我更喜歡在塊之後寫入break語句。

4

它應該出現後。

例如:

switch(value) 
{ 
    case 0: 
    { 
    // this ... 
    // that ... 
    // and the other ... 
    } 
    break; 
} 

編輯的文本下面

這主要以提高可讀性和可維護性這裏是一個例子。

switch (value) 
{ 
    case 0: 
    // Do this... 
    // Do that... 
    break; 
    case 1: 
    //and the other... 
    break; 
} 

switch (value) 
{ 
    case 0: 
    // Do this... 
    // Do that... 
    if (ObjectWithinScope.Type == Fault) 
    break; 
    case 1: 
    //and the other... 
    break; 
} 

當你開始遇到嵌套switch語句的情況下,它可以變得非常混亂確實現在有

switch (value) 
{ 
    case 0: 
    { 
    // Do this... 
    // Do that... 
    } 
    break; 
    case 1: 
    //and the other... 
    break; 
} 

switch (value) 
    { 
     case 0: 
     { 
     // Do this... 
     // Do that... 
     if (ObjectWithinScope.Type == Fault) 
     break; 
     } 
     case 1: 
     { 
     //and the other...   
     } 
     break; 
    } 

比較。

只是一個指針。

現在你們中的一些人仍然在想我在做什麼。這裏是。一段遺留代碼停止工作,沒有人可以解決原因。這一切都歸結爲結構像一塊下面的代碼:

switch (value) 
    { 
     case 0: 
     { 
     // Do this... 
     // Do that... 
     if (ObjectWithinScope.Type == Fault) 
     break; 
     } 
     case 1: 
     { 
     //and the other...   
     } 
     break; 
    } 

花了很長的時間來拖住這個代碼,但在檢查更改日誌它最初是作爲followws:

switch (value) 
    { 
     case 0: 
     { 
     // Do this... 
     // Do that... 
     if (ObjectWithinScope.Type == Fault) 
      // *** A line of code was here *** 
     break; 
     } 
     case 1: 
     { 
     //and the other...   
     } 
     break; 
    } 

不可否認,原始代碼與其本身並不一致,但通過在大括號中打破代碼的一行代碼被意外刪除時編譯的代碼。如果休息時間在括號外,那麼它不會有。

1

只要您和您的團隊始終如一地執行相同的操作,這並不重要。即便如此,如果不同的團隊成員以不同的方式做這件事,這不是一個大問題。

我個人比較喜歡之後。理由是它在switch語句的機制(跳到,執行和退出)和純粹涉及「做」情況的大括號內的代碼之間給出了一些分離。

如:

switch(value) 
{ 
    case 0: 
     { 
      // code here 
     } 
     break; 

    default: 
     { 
      assert(!"unhandled value in switch"); 
     } 
     break; 
} 

我只用{}的情況下,如果需要局部變量,但如果我使用{}任何情況下,我把他們的所有情況。

我通常總是定義一個默認情況來斷言是否有任何意外的值。這些斷言中有一個會多次提醒你缺少一個案例,這是驚人的。

0

這是一個風格問題,但我以後把它作爲我理解定義爲:

switch (variable) 
{ 
    case expression: 
     statement; 
     break; 
    default: 
     statement; 
     break; 
} 

where語句是一個單一的命令或塊。休息是獨立於這個聲明或塊。是的,我確實在缺省之後添加了一箇中斷,儘管它是多餘的。我也總是把括號括起來的聲明。我多次添加了一個語句來打破範圍。因爲我已將默認值更改爲缺省表達式:並在其後添加了一些內容,所以我將缺省添加到缺省值。防禦性編碼是你的朋友。

但是,我只能找到通過Microsoft的實際定義文件爲:

selection-statement: 
    switch (expression) statement 

labeled-statement: 
    case constant-expression : statement 
    default : statement 

這將表明它應該是內部的。

但是,從讀者的角度來看,我認爲外部是更清晰的,但它肯定是主觀的。

0

由於標準不限制你選擇break聲明的位置,所以你可以選擇任何你喜歡的。就個人而言,我使用以下樣式:

switch (some_var) { 
     case 1: { 
      // lot of code here 
     } break; 
     case 2: /* one call */ break; 
     case 3: /* one call */ break; 
     case 4: { 
      // lot of code here again 
     } break; 
    } 
4

每個人都同意我們需要的switch/case...機械在各種情況下執行的實際行動之間有清晰可辨的區別。

爲此,除非真的幾乎沒什麼每種情況下回事(簡單賦值左右),我建議使用switch作爲一個單純的調度,並委託「真實」的東西輔助功能。這自動解決了case-local變量的問題,並且完全不需要大括號。

switch(operation) { 
    case cnegation: r = -value; break; 
    case cinversion: r = 1./r; break; 
    case cfaculty: { 
    double r = value; 
    while(value != 1) 
     r *= --value; 
    } 
    break; 
} 

應該再成爲

switch(operation) { 
    case cnegation : r = negate (value) ; break; 
    case cinversion: r = invert (value) ; break; 
    case cfaculty : r = faculty(value) ; break; 
} 
0

有很多關於僅用一個語句每箱,從來沒有使用大括號的風格可說的。例如:

 
switch(cond) { 
default: foo(); break; 
case 0: bar(); break; 
case 1: baz(); break; 
} 

使用這種風格,你的問題是沒有意義的。

1

我不喜歡在switch語句中放置任何類型的括號。就個人而言,如果它是一個複雜的操作,我喜歡把它放在一個函數中。除了在每個「案例」之間有數百行代碼的切換語句之外,沒有什麼更讓人惱火的了,而且在其中一些代碼在各種情況下重複使得維護變得不可能。

例如:

switch(blah) 
{ 
case 1: 
    // do one thing 
    break; 

case 2: 
    doManyThings(); 
    break; 

default: 
    // something 
    break; 
} 
0

真正的答案:編譯不在乎。這是一個偏好問題。

我把它們放在裏面,就像google style guide一樣。

如果使用大括號,我喜歡左大括號與右大括號(它不同於谷歌)位於同一列。

switch (var) { 
    case 0: 
    { 
    ...  
    break; 
    } 
    case 1: 
    { 
    ... 
    break; 
    } 
    default: 
    assert(false); 
} 
0

我的...請看下面的例子。

縮進開關的所有情況,並在關鍵字switch下使用開關的右括號,就像在if語句中所做的那樣。無論何時需要,每條case聲明的規則相同:在case聲明之後的半列之後的括號後面打開,並在關鍵字case下關閉它們,然後縮進包含關鍵字break的每個case聲明的內容。

保持一致(縮進和括號的展示位置)和短期(不超過5-10的每case語句代碼行。複雜的項目,因爲嚴重縮進switch陳述與他們太多的代碼的失敗。

switch (number) { 

     case 1: 
      logFileStderr(VERBOSE, "MESSAGE: switch without brackets...\n"); 
      break; 

     case 2: { 
      logFileStderr(VERBOSE, "MESSAGE: switch with brackets...\n"); 
      break; 
     } 

     default: 
      logFileStderr(VERBOSE, "WARNING: Unknown option...\n"); 
      break; 
    }