【问题标题】:Having a switch statement case label without a value有一个没有值的 switch 语句 case 标签
【发布时间】:2019-09-11 02:18:00
【问题描述】:

当我不小心写了以下代码(在 C 中的 gcc 上)时,我正在处理 Switch 语句

        int a = 2;
        switch(a)
        {
                default:
                        printf("Default\n");
                case 1:
                        printf("One\n");          
                case2 :
                        printf("Two\n");
        }

我得到的输出是:

默认

一个

两个

我能够理解这个输出是如何产生的,但是我不明白为什么这不会引发错误,我的意思是我显然没有 case 标签(在 case2 中)对吗?例如,如果我将“case2”设置为“casex”,我也观察到了相同的结果。 而如果我不添加任何 case 标签,它会给出编译时错误。

任何帮助将不胜感激,谢谢!

【问题讨论】:

  • case2: 不会给你一个编译器警告吗?您的查询是关于那里缺少空格,还是缺少预期的 break 语句?
  • case2 是一个有效的标签;就switch 语句的范围而言,它不是case 标签。没有break,它会被忽略。
  • 我收到的警告(来自 MSVC)是warning C4102: 'case2': unreferenced label
  • 必须在每个case的代码后插入break语句。
  • > 我收到的警告(来自 MSVC)是警告 C4102: 'case2': unreferenced label。正如 Mark Benningfield 所提到的,case2 : 是一个“常规”标签(用于 goto),而不是 case 关键字。此警告表明您的程序中没有 goto case2; 语句...这里的结果是 case2 : 不是您的 switch 的情况,它只是 switch 块内的 goto 标签。

标签: c switch-statement


【解决方案1】:

您错过了break,因此在每个案例之后继续执行(但使用 != 1 来获得这 3 个输出)

注意case2: 被视为标签(对于 goto)所以不是错误

【讨论】:

  • 我认为 OP 知道这一点。
  • @WeatherVane 啊是的我读的很快……其实我只看了开头才回答,真丢人^^
  • 一开始我还以为case2 是一个错字,但在问题正文中又重复了一遍。
  • @WeatherVane 是的,我明白了......当我决定阅读问题而不仅仅是代码时 ^^
【解决方案2】:

这里发生的情况是你得到了默认标签,并且因为你没有中断,所以你继续处理所有其他情况。

【讨论】:

    【解决方案3】:

    我能够理解这个输出是如何产生的,但是我不知道 理解为什么这不会引发错误,我的意思是我显然没有 有一个案例标签(在案例2中)对吗?

    是的,case2 : 不是 case 标签,但它是有效的普通标签。任何语句前面都可以有这样的标签。由于您使用的是 GCC,您可以考虑打开 -Wall 选项(或特别是 -Wunused-label),在这种情况下,GCC 应该警告该标签未使用(因为它不是任何 goto 语句的目标) .

    我也观察到了同样的情况 例如,如果我将“case2”设置为“casex”,则结果。

    嗯,当然。 casex : 也是一个有效的普通标签。

    如果我不这样做 放在任何情况下标签都会给出编译时错误。

    我想你的意思一定是你留下了冒号,但删除了整个标签文本(case2/casex)。那确实会产生无效的代码。但是,如果您删除了整行,那当然没问题。

    【讨论】:

    • 抱歉,我的意思是写“case”,没有case 标签。阅读您的答案后,我认为由于 case 是保留字,因此会引发错误,因为它本身不是可能的标签,并且编译器将其视为 switch case 标签并要求在其后添加一个数字。
    • 是的,@KartikRamesh,case 保留用作关键字,因此case : 既不是有效的普通标签也不是有效的大小写标签。
    猜你喜欢
    • 1970-01-01
    • 2015-01-23
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-18
    • 2014-03-27
    • 1970-01-01
    相关资源
    最近更新 更多