2013-10-02 62 views
0

我只是爲了學習目的而做了這段代碼。但是這樣做的時候我發現了一個問題。這裏x是常量整數,仍然是編譯器給我錯誤。我正在使用gcc編譯器。請解釋此錯誤的原因以及如何避免此錯誤。切換到C編程

#include<stdio.h> 
int main() 
{ 
int const x = 10; 
int y = 20; 
switch(y) 
{ 
    case x:  //error: case label does not reduce to an integer constant 
    printf("value of x: %d\n",x); 
    break; 
} 
} 
+0

如果它是一個常量,爲什麼不使用'case 10:'代替,也需要'default' case – user1

+2

@ user1爲了便於閱讀,記住魔法數字是不好的。 – RedX

回答

2

您可以使用預處理作爲一種解決方法:

#define X 10 
// ... 
case X: 
+0

但據我所知預處理器也是常量不是一個常量限定符 – Tonmoy

+0

這顯然是重複的。爲什麼發佈答案? – RedX

+0

儘管原始問題與其中一個聯繫密切相關,但我認爲這個答案(這不是另一個答案的重複)仍然可能有助於避免不便。 – jev

2

在C一switch statement語法如下:

selection-statement: 
switch (expression) statement 
    labeled-statement: 
    case constant-expression : statement 
    default : statement 

因此,可以只使用常量表達式爲 「情況下的值」。 Constant expression is not the same as constant variable。換句話說 - 對不起,但你不能那樣做。

+0

好的......明白了......謝謝:) – Tonmoy

+0

這顯然是重複的。爲什麼發佈答案? – RedX

+0

@RedX:因爲回答這個問題比研究重複項更容易。沒有人會阻止你投票這個愚蠢的行爲。 – 2013-10-02 17:15:15

0

在這種情況下,您必須使用if聲明,因爲C的switch() 未採用表達式。它需要一個不變的。

+0

switch()接受一個表達式。情況xx:不會。 –

+0

這顯然是重複的。爲什麼發佈答案? – RedX

+0

抱歉,我沒有檢查。你能把它標記爲重複的嗎? –

1

可能知道x是恆定的,但是編譯器不能保證它:它是仍然在C語言的一個修改x方式是通過獲取其地址(通過指針)並將其解除引用。

在C中,只能打開文字整數類型;更正式地說,一個的常數表達式

+1

這顯然是一個重複的問題。爲什麼發佈答案? – RedX

0

case語句需要常量。你可以完成類似於你在宏中所做的事情。

#define TEN 10 
#include<stdio.h> 
int main() 
{ 
int const x = TEN; 
int y = 20; 
switch(y) 
{ 
    case TEN:  //error: case label does not reduce to an integer constant 
    printf("value of x: %d\n",x); 
    break; 
} 
} 
+0

這顯然是重複的。爲什麼發佈答案? – RedX

+0

重複什麼? 'devnull'和'jev'的答案出現在我的後面。如果它是第一個,它不是重複的。 – Joe

+0

關於網站上的另一個問題,請參閱關閉的投票。 – RedX