【发布时间】:2011-12-28 09:57:34
【问题描述】:
在 H&S5 中,我遇到了不使用大括号的“最奇怪”的 switch 语句(8.7.1,第 277 页)。
这是示例:
switch (x)
default:
if (prime(x))
case 2: case 3: case 5: case 7:
process_prime(x);
else
case 4: case 6: case 8: case 9: case 10:
process_composite(x);
这个想法似乎是为了避免 prime(x) 对于最常见的小数字的开销。
当我看到那个语句时,我对缺少大括号感到困惑,但检查官方语法(C1X pre-standard,6.8.4,第 147 页),语法是正确的:switch 语句在switch 表达式和右括号。
但在我的编程实践中,我再也没有遇到过如此奇怪的 switch 语句(而且我不想在代码中看到任何我必须负责的代码),但我开始怀疑:
你们有谁知道这样一个 switch 表达式,一个不使用大括号但仍然有意义的表达式?不只是 switch (i);(这是合法的,但 NOP),而是使用至少两个具有某种有用目的的 case 标签?
【问题讨论】:
-
你的“最离奇”switch语句是Duff's Device吗?
-
不,不是。我将为那些无法访问 H&S5 的人添加代码示例。达夫的装置需要大括号!
-
很好的例子。我不认为缺少大括号是特殊性,在这里。您的示例也适用于大括号。这里不同寻常的是让
switch标记语句的不同逻辑级别。 -
@JensGustedt 是的,它可以与大括号一起使用,但它是迄今为止我见过的唯一一个在没有它们的情况下也可以工作并且似乎仍然有用的方法。
-
为了便于记录,“H&S5”是 Samuel Harbison 和 Guy Steele 的 C: A Reference Manual 的第五版。 (我不知道,只好通过搜索代码片段来追踪它。)
标签: c language-lawyer