C++ If 语句在 switch 中的 case 之前

我的任务是为我的公司重写一些旧软件,并在源代码中发现了一个有趣的结构。

switch(X){
    if(Y==Z){
       case A: ... break;
       case B: ... break;
    }
    case C: ... break;
    default: ...;
}

编译器警告我, if 语句中的代码不会被执行,但是在测试时似乎 if 语句没有经过验证,但是 case 语句是。

有什么理由,也许是早期的 C++ 天,因为一些代码到现在已经超过 20 年了,你为什么要编写这样的构造?它在生产代码中,所以它似乎确实在做某事?

如果我能像编译器似乎做的那样忽略它,我会感谢任何内部原因。

编辑:它也多次发生,所以它似乎不是一个简单的错误。这让我感到困惑。

Edit2:这是我用于测试的示例。我不确定它有多大帮助,但是原始代码在一个 1200 行的怪物函数中,因此从中创建一个基本上是不可能的。

for (int i=0; i<5;i++)
{
    switch(i)
    {
        if (i==0 || i ==1)
        {
            cout << "reached before case";
            case 0: cout << "inside case 0" << std::endl; break;
            case 1: cout << "inside case 1" << std::endl; break;
            case 2: cout << "inside case 2" << std::endl; break;
        }
        case 3: cout << "inside case 3" << std::endl; break;
        default: cout << "inside default" << std::endl;
    }
}
埃罗里卡

有什么理由……你为什么要写这样的结构?

只有作者肯定知道(甚至他们可能不知道)。如果有可用的源版本控制元数据,则关联的提交消息可能很有用。没有更多信息,我们只能猜测他们在想什么。一些可能的答案:

  • 作者假设 if 语句的条件会产生一些影响,但他们错了,错误没有经过测试。
  • 这是一些重构的残余结果。
    • 也许删除了一些用于使语句有意义的代码。
    • 或者它可能是从其他有意义的地方复制而来的。
    • 或者,也许曾经有一系列 if 语句,并且打算用 switch 替换它们,但这种变化是半途而废的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章