2017-09-19 54 views
-2
int main() { 
    int marks; 
    printf("enter the marks :"); 
    scanf(" %d", &marks); 

    switch (marks) { 
     case (marks >= 90): 
     printf("Excellent"); 
     break; 
     case (marks < 90 && marks >= 75): 
     printf("very good"); 
     break; 
     case (marks < 40): 
     printf("poor"); 
     break; 
     default: 
     printf("no marks available"); 
    } 
    return 0; 
} 

我最近開始學習C,並在運行switch聲明時遇到了這種情況下的標籤錯誤。爲什麼在這個特定的程序中案例標籤不會減少到一個整數常量?

請有人解決這個問題?

+3

因爲C的'switch/case'不是'match'?你不能像這樣使用它,'case's只是整型常量表達式。 – EOF

+2

您不能將範圍放在'switch ... case'中,只能是單個值。你必須鏈接'if ... else if ... else'語句。 – AntonH

+0

爲什麼你認爲這是一個_constant表達_? – Olaf

回答

0

你不能在條件下提出條件。從https://www.tutorialspoint.com/cprogramming/switch_statement_in_c.htm

案例的常量表達式必須與開關中的變量具有相同的數據類型,並且它必須是常量或文字。

+0

我認爲大小寫後的值應嚴格爲int或char。 – akshayk07

+0

@ akshayk07需要成爲_conditional-expression_。 'char'在這裏並不特別。 – chux

+0

@chux Switch case不適用於'float',我認爲 – akshayk07

1

該情況必須保持不變。 case (marks>=90):不使用常量。

每個case標籤的表達應該是整型常量表達式和沒有兩個在same switch語句中case常量表達式的應變換後具有相同的值」 3§6.8.4.2

例如:

switch (grade) { 
    case 'A': printf("Excellent"); break; 
    case 'B': printf("very good"); break; 
    case 'C': // fall though (no break) 
    case 'D': printf("poor"); break; 
    default: printf("Hmmm"); 
} 

OP的代碼將與得到更好的服務

// switch(marks){ 
// case (marks>=90): 
if (marks>=90) { 
    printf("Excellent"); 
} else if (marks>=75) { 
    printf("very good"); 
} else if (marks < 40){ // Perhaps OP wants (marks > 40) here 
    printf("poor"); 
} else { 
    printf("no marks available"); 
} 
1

「修理」這一點,你會寫

switch(marks) // branch to the label corresponding to the value stored in marks 
{ 
    case 100: 
    case 99: 
    // repeat with cases 98 through 91. 
    case 90: 
    printf("Excellent!\n"); 
    break; 

    case 89: 
    case 88: 
    // repeat with cases 87 through 76 
    case 75: 
    printf("very good\n"); 
    break; 

    // pattern should be obvious from here 
} 

case標籤必須是整型常量表達式,基本的東西,可以在編譯時進行評估。像marks >= 90這樣的關係表達式不會被視爲常量表達式。

switch分支到相應於值的marks標籤; IOW,如果您想在marks的值爲90100之間的任何值時執行操作,則您爲上述每個值分別標記一個標籤。

您通常不會使用switch語句,其中涉及的值範圍如下所示;這可以通過if-else聲明更好地完成。

編輯

作爲參考,下文中可被用作case標籤:

  • 一個整數文字(十進制,十六進制或八進制格式);
  • 字符常量(如'A','?','\n'等));
  • 枚舉常量;
  • 由任何以前的表達式組成的算術表達式;
  • 一個擴展到任何以前表達式的宏;

一個const -qualified變量不是常量表達式就爲C而言,所以你不能做這樣的事情:

const int foo = 10; 
... 
switch(bar) 
{ 
    case foo: ... // compiler will yell at you here 

在你不能對字符串分支a switch;然而,你可以計算一個字符串的整數散列,並基於此分支:

#define FOO_HASH 0xb887389 // result of running hash function on "foo" 
#define BAR_HASH 0xb8860ba // result of running hash function on "bar" 

/** 
* djb2 is a popular hash function 
* see http://www.cse.yorku.ca/~oz/hash.html for others 
*/ 
unsigned long hash(const char *text) 
{ 
    const unsigned char *str = (const unsigned char *) text; 
    unsigned long hash = 5381; 
    int c; 

    while (c = *str++) 
     hash = ((hash << 5) + hash) + c; /* hash * 33 + c */ 

    return hash; 
} 

char text[SIZE]; 
if (!fgets(text, sizeof text, stdin)) 
    // bail on input error 

// remove newline from text somehow 

switch(hash(text)) 
{ 
    case FOO_HASH: 
    // do something 
    break; 

    case BAR_HASH: 
    // do something else 
    break; 
} 
+0

很好的解釋。在研究這個問題時,似乎像'case INT_MAX/2:...'這樣的代碼也可以。照我看來。 'UINTMAX_MAX:...'也可以,雖然使用更廣泛的'int'並不是我在生產代碼中完成的。 – chux

相關問題