【问题标题】:Quasi "If" in switch/case [duplicate]开关/案例中的准“如果”[重复]
【发布时间】:2021-02-08 17:36:20
【问题描述】:

我遇到了新的 C/C++ switch/if/else/case 语法。 我在 C 标准中找不到它的提及。 "if" 中的值无关紧要,"if(1)" 或 "if(0)" 的作用相同。 似乎这个“如果”不像条件,而是作为范围。 是编译器扩展还是编译器糖?

#include <stdio.h>

int main()
{
    int a = 0, b = -1, c = -1;
    switch(a)
    {
        if(1) { 
            case 0: b = 0;
            printf("%u:b=%d\n", __LINE__, b);
        }
        else if(0) {
            case 1: b = 1; 
            printf("%u:b=%d\n", __LINE__, b);
        }
        else if(0) {
            case 2: b = 2; 
            printf("%u:b=%d\n", __LINE__, b);
        }
        else {
            case 3: b = 3; 
            printf("%u:b=%d\n", __LINE__, b);
        }
        c = 0;
        printf("%u:b=%d, c=%d\n", __LINE__, b, c);
        break;
    }

    printf("b=%d", b);
    return 0;
}

【问题讨论】:

  • 您希望这些 if 语句在这里发生什么?
  • 以后,请只用一种语言标记问题,C 或 C++,除非它涉及它们之间的一些差异或交互。不同语言的答案可能不同,因此应在不同的问题中解决。
  • 我添加了 C 和 C++,因为我使用 C 和 C++ 编译器进行了测试

标签: c++ c


【解决方案1】:

switch跳转到选定的case 标签。 if 条件永远不会被评估,因为程序控制永远不会流向它们。这是由 C 标准和 C++ 标准指定的。

【讨论】:

  • 这是为了避免使用break而精心设计的解决方法吗?它似乎具有相同的效果(+额外的警告)
  • 也许吧。我在github.com/jmacd/xdelta看到了这样的做法,让我很好奇
  • @Yksisarvinen:它给出了一个不同于 break 的控制流:在执行特定的 case 代码之后,控制流从链式 if-else 语句流到它后面的语句,但仍在switch 语句,而 break 将退出 switch。这也不同于将这些语句放在 switch 之后,因为它们仅在某些情况匹配时执行(而不是在没有情况匹配的情况下)。但是,代码相当丑陋和迟钝,因此看起来不值得。
猜你喜欢
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-21
  • 1970-01-01
  • 2011-03-24
  • 1970-01-01
相关资源
最近更新 更多