switch 中 case 之前的 C++ If 语句
C++ If statement before case in switch
我的任务是为我的公司重写一些旧软件,并在源代码中发现了一个有趣的结构。
switch(X){
if(Y==Z){
case A: ... break;
case B: ... break;
}
case C: ... break;
default: ...;
}
编译器警告我,if 语句中的代码将不会执行,但在测试时似乎 if 语句未通过验证,但 case 语句是。
有什么原因吗,也许是早期的 C++ 时代,因为一些代码到现在已经超过 20 年了,为什么要编写这样的结构?它在生产代码中,所以它似乎确实做了一些事情?
如果我能像编译器所做的那样忽略它,我将不胜感激。
编辑:
它也出现了多次,所以它似乎不是一个简单的错误。这就是让我困惑的地方。
编辑2:
这是我用于测试的示例。我不确定它有多大帮助,但是原始代码在一个 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;
}
}
Is there any reason ... why you would write a construct like that?
只有作者自己知道(他们也不一定知道)。如果有可用的源版本控制元数据,那么关联的提交消息可能会有用。没有更多信息,我们只能猜测他们在想什么。一些可能的答案:
- 作者假设if-statement的条件会产生一些效果,但是他们错了,没有测试这个错误。
- 这是一些重构的残留结果。
- 也许删除了一些用于使语句有意义的代码。
- 或者它可能是从其他地方复制过来的,但它确实有意义。
- 或者也许曾经有一系列的if-statement,并且有意用开关替换它们,但变化是half-assed。
我的任务是为我的公司重写一些旧软件,并在源代码中发现了一个有趣的结构。
switch(X){
if(Y==Z){
case A: ... break;
case B: ... break;
}
case C: ... break;
default: ...;
}
编译器警告我,if 语句中的代码将不会执行,但在测试时似乎 if 语句未通过验证,但 case 语句是。
有什么原因吗,也许是早期的 C++ 时代,因为一些代码到现在已经超过 20 年了,为什么要编写这样的结构?它在生产代码中,所以它似乎确实做了一些事情?
如果我能像编译器所做的那样忽略它,我将不胜感激。
编辑: 它也出现了多次,所以它似乎不是一个简单的错误。这就是让我困惑的地方。
编辑2: 这是我用于测试的示例。我不确定它有多大帮助,但是原始代码在一个 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;
}
}
Is there any reason ... why you would write a construct like that?
只有作者自己知道(他们也不一定知道)。如果有可用的源版本控制元数据,那么关联的提交消息可能会有用。没有更多信息,我们只能猜测他们在想什么。一些可能的答案:
- 作者假设if-statement的条件会产生一些效果,但是他们错了,没有测试这个错误。
- 这是一些重构的残留结果。
- 也许删除了一些用于使语句有意义的代码。
- 或者它可能是从其他地方复制过来的,但它确实有意义。
- 或者也许曾经有一系列的if-statement,并且有意用开关替换它们,但变化是half-assed。