我很困惑與下面的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
爲一個常量,爲什麼這段代碼給出了一個編譯錯誤?
我很困惑與下面的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
爲一個常量,爲什麼這段代碼給出了一個編譯錯誤?
常量變量仍然不是常量表達式。 Constexprs(通常指的是)只能包含文字和編譯時常量。
這是因爲你在代碼中使用變量。你不能在case語句中使用變量。 這裏,假定爲可變
編譯器明確允許使用有效的二進制樹或 跳轉表來評估case語句。
因此,case語句是編譯時間常量。
C99標準說,這(和C89標準非常相似):
§6.8.4.2switch語句
約束
¶1的控制表達式switch語句應該有整數 類型。
[...]
¶3每種情況下標籤的表達應是整數常量 表達並以相同的 switch語句應具有轉換後的相同的值沒有兩個的情況下的常量表達式。可能 在switch語句中最多隻有一個默認標籤。
原因:
1. const
不能在switch語句中使用。不過你可以使用#define/enum
。請參閱this link。對於第二種情況,沒有break
。
3.沒有default
的情況。
4.在case
之後應該有一個冒號。
你缺少'default'。 – Mysticial
你在'case i'後面有一個分號,它應該是一個冒號 –
switch(2)看起來很奇怪 –