當我在case
的代碼塊周圍使用大括號來定位變量時,我應該把break
放在塊的內部還是外部?在哪裏把break在開關/ case語句中與塊
case FOO: // 'break' inside
{
int i;
doStuff();
break;
}
case BAR: // 'break' outside
{
int i;
doStuff();
}
break;
謝謝。
當我在case
的代碼塊周圍使用大括號來定位變量時,我應該把break
放在塊的內部還是外部?在哪裏把break在開關/ case語句中與塊
case FOO: // 'break' inside
{
int i;
doStuff();
break;
}
case BAR: // 'break' outside
{
int i;
doStuff();
}
break;
謝謝。
這是一個風格問題。
我會把break
放在右大括號之外,這樣才能使它更具可讀性。
它確實取決於你的代碼的邏輯以及它如何使用大括號,但爲了正確的答案,如果你把它放在裏面,試着把它們全部放在裏面。
你把它放在任何你喜歡的地方。確保你在整個項目中保持一致。 (我個人把它放在外面。)
一致性規則!+1 – xtofl 2009-07-23 11:42:32
一致性+1 :-) – 2009-07-23 14:53:41
+1 I + 1剛剛毀了你的@xtofl一致性。 @MartinYork;) – 2011-03-06 20:13:35
我通常把break
的括號內,像這樣:
switch (foo) {
case bar: {
int x = 5;
printf("%d\n", x);
break;
}
case baz: {
// ...
break;
}
}
然而,因爲這是我的規則我可以自由地打破它(沒有雙關語意),每當我想要的。
在我看來,你應該避免switch語句中的局部變量和塊。無論如何,你也應該避免長時間或複雜甚至級聯的開關語句。 但沒有規則沒有例外......我更喜歡在塊之後寫入break語句。
它應該出現後。
例如:
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;
}
不可否認,原始代碼與其本身並不一致,但通過在大括號中打破代碼的一行代碼被意外刪除時編譯的代碼。如果休息時間在括號外,那麼它不會有。
只要您和您的團隊始終如一地執行相同的操作,這並不重要。即便如此,如果不同的團隊成員以不同的方式做這件事,這不是一個大問題。
我個人比較喜歡之後。理由是它在switch語句的機制(跳到,執行和退出)和純粹涉及「做」情況的大括號內的代碼之間給出了一些分離。
如:
switch(value)
{
case 0:
{
// code here
}
break;
default:
{
assert(!"unhandled value in switch");
}
break;
}
我只用{}的情況下,如果需要局部變量,但如果我使用{}任何情況下,我把他們的所有情況。
我通常總是定義一個默認情況來斷言是否有任何意外的值。這些斷言中有一個會多次提醒你缺少一個案例,這是驚人的。
這是一個風格問題,但我以後把它作爲我理解定義爲:
switch (variable)
{
case expression:
statement;
break;
default:
statement;
break;
}
where語句是一個單一的命令或塊。休息是獨立於這個聲明或塊。是的,我確實在缺省之後添加了一箇中斷,儘管它是多餘的。我也總是把括號括起來的聲明。我多次添加了一個語句來打破範圍。因爲我已將默認值更改爲缺省表達式:並在其後添加了一些內容,所以我將缺省添加到缺省值。防禦性編碼是你的朋友。
但是,我只能找到通過Microsoft的實際定義文件爲:
selection-statement:
switch (expression) statement
labeled-statement:
case constant-expression : statement
default : statement
這將表明它應該是內部的。
但是,從讀者的角度來看,我認爲外部是更清晰的,但它肯定是主觀的。
由於標準不限制你選擇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;
}
每個人都同意我們需要的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;
}
有很多關於僅用一個語句每箱,從來沒有使用大括號的風格可說的。例如:
switch(cond) { default: foo(); break; case 0: bar(); break; case 1: baz(); break; }
使用這種風格,你的問題是沒有意義的。
我不喜歡在switch語句中放置任何類型的括號。就個人而言,如果它是一個複雜的操作,我喜歡把它放在一個函數中。除了在每個「案例」之間有數百行代碼的切換語句之外,沒有什麼更讓人惱火的了,而且在其中一些代碼在各種情況下重複使得維護變得不可能。
例如:
switch(blah)
{
case 1:
// do one thing
break;
case 2:
doManyThings();
break;
default:
// something
break;
}
真正的答案:編譯不在乎。這是一個偏好問題。
我把它們放在裏面,就像google style guide一樣。
如果使用大括號,我喜歡左大括號與右大括號(它不同於谷歌)位於同一列。
switch (var) {
case 0:
{
...
break;
}
case 1:
{
...
break;
}
default:
assert(false);
}
我的...請看下面的例子。
縮進開關的所有情況,並在關鍵字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;
}
請問您能澄清一下嗎;問題是沒有道理的...... – 2009-07-23 11:12:50
我認爲它很有意義 – 2009-07-23 11:16:58
儘管有意義,但代碼示例將無一例外地使其更加清晰 – dmckee 2009-07-23 15:09:20