我有一个情况,我希望在C++切换语句中有两种情况都会下降到第三种情况.具体来说,第二个 case 将通过第三个 case ,第一个 case 也将通过第二个 case 通过第三个 case .

我有个愚蠢的 idea ,试了试,结果奏效了!我把第二个箱子装在if (0) {.}.它看起来是这样的:

#ifdef __cplusplus
#  include <cstdio>
#else
#  include <stdio.h>
#endif

int main(void) {
    for (int i = 0; i < 3; i++) {
        printf("%d: ", i);
        switch (i) {
        case 0:
            putchar('a');
            // @fallthrough@
            if (0) {        // fall past all of case 1 (!)
        case 1:
            putchar('b');
            // @fallthrough@
            }
        case 2:
            putchar('c');
            break;
        }
        putchar('\n');
    }
    return 0;
}

当我运行它时,我会得到所需的输出:

0: ac
1: bc
2: c

我在C和C++(都使用clang)中try 了一下,它做了同样的事情.

我的问题是:这是有效的C/C++吗?它应该做它该做的事吗?

推荐答案

是的,这是允许的,它做你想要的.对于switch语句,C++标准says:

大小写和默认标签本身不会改变控制流,控制流在这些标签之间继续畅通无阻.要退出switch ,请参见"断开".

[注1:通常,switch的主语是component,case和default标签出现在(component)substate中包含的 top-level 中,但这不是必需的.声明可以出现在switch语句的substate中.-end Note]

因此,当对if语句求值时,控制流按照if语句的规则进行,而不考虑中间的大小写标签.

C++相关问答推荐

sscanf:如何解析

getchar读css + z还是返回css?

在#include中使用C宏变量

我应该如何解决我自己为iOS编译的xmlsec1库的问题?转换Ctx.first在xmlSecTransformCtxPrepare()之后为空

Ruby C Api处理异常

正确的TCP/IP数据包 struct

如何有效地编写代码来判断两个元素数量相同的数组即使在不同的位置也具有相同的元素?

这个C程序在工作中途停止获取输入.我收到分段故障(核心转储).我还是不知道问题出在哪里

如何使用_newindex数组我总是得到错误的参数

为什么函数是按照定义的顺序执行的,而不是按照从avr-c中的int main()调用的顺序执行的?

如何在双向表中实现线程安全,每个条目仅使用4位,同时避免任何全局锁?

使用ld将目标文件链接到C标准库

为什么电路板被循环删除?

C23标准是否向后兼容?

如何在不更改格式说明符的情况下同时支持双精度和长双精度?

为什么GCC 13没有显示正确的二进制表示法?

&stdbool.h&q;在嵌入式系统中的使用

挥发性语义的形式化理解

macos/arm64 上地址空间不使用第一位吗?

如何找出C中分配在堆上的数组的大小?