2012-09-06 63 views
1

我很困惑與下面的C代碼:開關和外殼錯誤?

int main() 
{ 
const int i=2; 

switch(2) 
{ 
    case 1: 
    printf("this is case 1"); 
    break; 
    case i: 
    printf("it should be case 2"); 
} 

我知道關鍵字case後,應該有一個常量表達式。

正如已經聲明i爲一個常量,爲什麼這段代碼給出了一個編譯錯誤?

+0

你缺少'default'。 – Mysticial

+4

你在'case i'後面有一個分號,它應該是一個冒號 –

+4

switch(2)看起來很奇怪 –

回答

9

因爲在C a const不是一個真正的編譯時常量。它只是一個只讀對象。關於這個主題有一個C FAQ

+4

如果這是C++,那麼代碼會偏心('switch(2)'不是很合理)但它會工作。 –

2

常量變量仍然不是常量表達式。 Constexprs(通常指的是)只能包含文字和編譯時常量。

0

這是因爲你在代碼中使用變量。你不能在case語句中使用變量。 這裏,假定爲可變

編譯器明確允許使用有效的二進制樹或 跳轉表來評估case語句。

因此,case語句是編譯時間常量。

C99標準說,這(和C89標準非常相似):

§6.8.4.2switch語句

約束

¶1的控制表達式switch語句應該有整數 類型。

[...]

¶3每種情況下標籤的表達應是整數常量 表達並以相同的 switch語句應具有轉換後的相同的值沒有兩個的情況下的常量表達式。可能 在switch語句中最多隻有一個默認標籤。

2

原因:

1. const不能在switch語句中使用。不過你可以使用#define/enum。請參閱this link。對於第二種情況,沒有break

3.沒有default的情況。

4.在case之後應該有一個冒號。