3

爲了以後的讀者和我自己的理智後來的興趣,我想清楚地說明switch沒有default的情況(由於所有情況都被覆蓋)或順序if-elseif-else與最後的不應該做任何事情的最後一定不能省略,並且包括該效果的評論(參見示例)。C++:switch語句在關閉大括號之前缺少分號

但是,每當我包括在switch聲明default情況下,讓它空我必須把分號default情況或編譯器錯誤中:「行`失蹤[switch語句的結束花的線路]‘;’在'}'之前發生。 爲什麼?

例:生成編譯器錯誤

switch(direction) { 
    case MOVE_UP: 
    //... 
    break; 
    case MOVE_RIGHT: 
    //... 
    break; 
    case MOVE_DOWN: 
    //... 
    break; 
    case MOVE_LEFT: 
    //... 
    break; 
    default: 
     /* DO NOTHING */ 
} 

實例:不生成編譯器錯誤

switch(direction) { 
    case MOVE_UP: 
    //... 
    break; 
    case MOVE_RIGHT: 
    //... 
    break; 
    case MOVE_DOWN: 
    //... 
    break; 
    case MOVE_LEFT: 
    //... 
    break; 
    default: 
     /* DO NOTHING */; 
} 
+1

僅供參考在C++中默認情況下是可選的... – AJG85

+3

如果要保持一致,請在默認情況下放置一個'break;'。 –

回答

9

6.1/C++中03 1給出了文法標記的語句:

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

C++ 11是一樣的,除非你可以有標籤之前的屬性。

令牌的零長度序列不是語句在C++,因此default:自身不是標記語句

這就是說,我不知道爲什麼標記語句的語法不允許default: statementopt的原因是什麼。如果它沒有那麼就不會有,如果你寫了一個default : case 1: break;歧義,case 1: break;是否是聲明屬於default:,還是default:有沒有自己的聲明,但緊接着一個。毫無疑問,它是什麼意味着,但也許它被認爲會弄亂人們的解析器。

+1

將其更改爲接受的答案。爲勝利的參考。 – Casey

12

因爲你需要一份聲明中爲您default情況。分號是一個空白語句。