“修理”这一点,你会写
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