「修理」這一點,你會寫
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
的值爲90
到100
之間的任何值時執行操作,則您爲上述每個值分別標記一個標籤。
您通常不會使用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;
}
因爲C的'switch/case'不是'match'?你不能像這樣使用它,'case's只是整型常量表達式。 – EOF
您不能將範圍放在'switch ... case'中,只能是單個值。你必須鏈接'if ... else if ... else'語句。 – AntonH
爲什麼你認爲這是一個_constant表達_? – Olaf