其實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」,或者默認分手並明確地繼續。從常識的角度來看,後者似乎更自然,但考慮到實施,默認穿透是更自然的,因此被選中。 –