Joh*_*zem 44 c language-lawyer
在H&S5中,我遇到了"最离奇"的切换语句(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);
Run Code Online (Sandbox Code Playgroud)
这个想法似乎是为了避免prime(x)
最常见的小数字的开销.
当我看到这个陈述时,我对丢失的大括号感到困惑,但是检查官方语法(C1X预标准,6.8.4,第147页),语法是正确的:switch语句只是在切换表达式之后有一个语句和右括号.
但是在我的编程实践中,我再也没有遇到过这样一个好奇的切换语句(我不想看到任何代码,我必须承担责任),但我开始想知道:
你们中的任何人都知道这样的开关表达式,一个没有使用大括号,但仍然有意义吗?不只是switch (i);
(这是合法的,而是NOP),但使用至少两个具有某种有用目的的案例标签?
如果你在宏中使用控制结构switch
而不是if
方便,因为它没有悬空else
问题.
#define DEBUG_PRINT(...) switch (!debug_mode) case 0: fprintf(__VA_ARGS__)
Run Code Online (Sandbox Code Playgroud)
如果该宏的用户将其置于附加条件下,您就不会感到意外
if (unclear) DEBUG_PRINT(stderr, "This is really %unclear\n", unclear);
else {
// do something reasonable here
}
Run Code Online (Sandbox Code Playgroud)
这样的调试宏具有始终编译(然后最终优化)的优点.因此,调试代码必须在程序的所有实时时间内保持有效.
另请注意,重要的switch
是不使用{}
,否则if/else
示例也不起作用.所有这一切都可以通过其他方式(来实现if/else
,(void)0
而do/while
技巧),但是这一个是最方便的,我知道的.
并且不要误解我的意思,我不是说每个人都应该在宏中使用控制结构,你当然应该知道你在做什么.但有些情况是合理的.