是否有一个使用没有大括号的switch语句的有用案例?

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),但使用至少两个具有某种有用目的的案例标签?

Jen*_*edt 9

如果你在宏中使用控制结构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)0do/while技巧),但是这一个是最方便的,我知道的.

并且不要误解我的意思,我不是说每个人都应该在宏中使用控制结构,你当然应该知道你在做什么.但有些情况是合理的.

  • 你的例子中的"switch"语句是否比`do {this; that; the_other;} while(0)`pattern?后者是我认为在我不能将它们写为虚拟右值的情况下编写伪函数宏的正常惯用方法(例如`#define begin_write(x)(write_mode = 1,begin_read_or_write((x)) ))`. (2认同)