其实switch语句按照您观察的方式工作。它的设计使您可以将多个案例组合在一起,直到遇到中断并且它像筛子一样。
这里是我的一个项目一个真实的例子:
struct keystore_entry *new_keystore(p_rsd_t rsd, enum keystore_entry_type type, const void *value, size_t size) {
struct keystore_entry *e;
e = rsd_malloc(rsd, sizeof(struct keystore_entry));
if (!e)
return NULL;
e->type = type;
switch (e->type) {
case KE_DOUBLE:
memcpy(&e->dblval, value, sizeof(double));
break;
case KE_INTEGER:
memcpy(&e->intval, value, sizeof(int));
break;
/* NOTICE HERE */
case KE_STRING:
if (size == 0) {
/* calculate the size if it's zero */
size = strlen((const char *)value);
}
case KE_VOIDPTR:
e->ptr = rsd_malloc(rsd, size);
e->size = size;
memcpy(e->ptr, value, size);
break;
/* TO HERE */
default:
return NULL;
}
return e;
}
为KE_STRING
和KE_VOIDPTR
案件的代码是除了大小的字符串的情况下的计算相同。
: - 感谢您的精心答复!我确实知道它是如何工作的,它只是反对我的常识而已。我仍然认为这种行为是违反直觉的。我一直认为那些“案例(blah)”有点像检查,以确保如果你的变量确实是(blah)..明显不是C的工作原理! – Manish
@Manish:开关通常使用“[分支表](http://en.wikipedia.org/wiki/Branch_table)”来实现,这样也可以帮助您理解。编程中不存在常识,顺便说一句。你需要“程序员的感觉”而不是:) –
@Manish这两种行为都是可取的,如果需要的话,可以有默认的贯穿和显式的“break”,或者默认分手并明确地继续。从常识的角度来看,后者似乎更自然,但考虑到实施,默认穿透是更自然的,因此被选中。 –